Использование импорта раздвоенных пакетов в Go



предположим, что у вас есть репозиторий в github.com/someone/repo и вы раскошелитесь на github.com/you/repo. Вы хотите использовать свою вилку вместо основного РЕПО, поэтому вы делаете



go get github.com/you/repo


теперь все пути импорта в этом РЕПО будут "сломаны", то есть, если в репозитории есть несколько пакетов, которые ссылаются друг на друга через абсолютные URL-адреса, они будут ссылаться на источник, а не на вилку.



есть ли лучший способ, как клонирование вручную в правильном пути?



git clone [email protected]:you/repo.git $GOPATH/src/github.com/someone/repo
518   7  
go

7 ответов:

для обработки запросов на вытягивание

  • fork репозиторий: github.com/someone/repo к github.com/you/repo
  • получить исходный код: go get github.com/someone/repo
  • добавить пульт в репо:git remote add myfork https://github.com/you/repo.git
  • толкать свои изменения: git push myfork

http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html

для использования пакета в вашем проект

https://github.com/golang/go/wiki/PackageManagementTools

один из способов решить это, что предложил Иван рейв и http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html -- путь разветвления.

еще один способ обойти golang поведение. Когда ты go get,golang выкладывает ваши каталоги под тем же именем, что и в URI репозитория, и именно здесь начинается проблема.

если, вместо этого, вы выпускаете свой собственный git clone, вы можете клонировать репозиторий на вашу файловую систему по пути, названному в честь исходного репозитория.

предполагая, что исходный репозиторий находится в github.com/awsome-org/tool и вы вилка его на github.com/awesome-you/tool вы можете:

cd $GOPATH
mkdir -p {src,bin,pkg}
mkdir -p src/github.com/awesome-org/
cd src/github.com/awesome-org/
git clone [email protected]:awesome-you/tool.git # OR: git clone https://github.com/awesome-you/tool.git
cd tool/
go get ./...

golang совершенно счастлив продолжить работу с этим репозиторием и на самом деле не волнует, что какой-то верхний каталог имеет имя awesome-org в то время как git remote awesome-you. Весь импорт для awesome-org resovled через каталог, который вы только что создали, который является вашим локальным рабочим набор.

более подробно, пожалуйста, смотрите мой блог:разветвление репозиториев Golang на GitHub и управление путем импорта

edit: исправлен путь к каталогу

если ваша вилка только временная (т. е. вы намереваетесь, чтобы она была объединена) , то просто сделайте свою разработку на месте, например, в $GOPATH/src/launchpad.net/goamz.

затем вы используете функции системы контроля версий (например,git remote) чтобы сделать вышестоящий репозиторий вашим репозиторием, а не оригинальным.

это делает его более трудным для других людей, чтобы использовать свой репозиторий с go get но гораздо проще для него быть интегрированы вверх по течению.

на самом деле у меня есть репозиторий для goamz at lp:~nick-craig-wood/goamz/goamz который я разрабатываю именно таким образом. Может быть, автор сольет его в один прекрасный день!

ответ на это заключается в том, что если вы разветвляете РЕПО с несколькими пакетами, вам нужно будет переименовать все соответствующие пути импорта. Это в значительной степени хорошо, так как вы разветвили все эти пакеты, и пути импорта должны отражать это.

вот способ, который работает для всех:

используйте github, чтобы раскошелиться на мой / РЕПО

go get github.com/my/repo
cd ~/go/src/github.com/my/repo
git branch enhancement
rm -rf .
go get github.com/golang/tools/cmd/gomvpkg/…
gomvpkg <<oldrepo>> ~/go/src/github.com/my/repo
git commit

сделать лучше код

git commit
git checkout enhancement
git cherry-pick <<commit_id>>

("мой/РЕПО" является заполнителем)

почему? Это позволяет вам иметь свое РЕПО, с которым работает любой "go get". Он также позволяет поддерживать и улучшать ветвь, которая хороша для запроса слияния. Он не раздувает git с "поставщиком", он сохраняет историю, и инструменты сборки могут иметь смысл.

чтобы автоматизировать этот процесс, я написал небольшой скрипт. Вы можете найти более подробную информацию о моем блог чтобы добавить команду, как "gofork" к вашей Баш.

function gofork() {
  if [ $# -ne 2 ] || [ -z "" ] || [ -z "" ]; then
    echo 'Usage: gofork yourFork originalModule'
    echo 'Example: gofork github.com/YourName/go-contrib github.com/heirko/go-contrib'
    return
  fi
   echo "Go get fork  and replace  in GOPATH: $GOPATH"
   go get 
   go get 
   currentDir=$PWD
   cd $GOPATH/src/
   remote1=$(git config --get remote.origin.url)
   cd $GOPATH/src/
   remote2=$(git config --get remote.origin.url)
   cd $currentDir
   rm -rf $GOPATH/src/
   mv $GOPATH/src/ $GOPATH/src/
   cd $GOPATH/src/
   git remote add their $remote2
   echo Now in $GOPATH/src/ origin remote is $remote1
   echo And in $GOPATH/src/ their remote is $remote2
   cd $currentDir
}

export -f gofork

используйте вендоринг и подмодули вместе

  1. вилка lib на github (go-mssqldb в этом случае)
  2. добавить подмодуль, который клонирует вилку, но имеет путь вверх по течению reop

например.

cd ~/go/src/github.com/myproj

mygithubuser=timabell
upstreamgithubuser=denisenkom
librepo=go-mssqldb

git submodule add "[email protected]:$mygithubuser/$librepo" "vendor/$upstreamgithubuser/$librepo"

почему

скачать все проблемы, о которых я слышал и сталкивался, пытаясь понять это сам.

  • внутренний пакет refs в lib теперь работает, потому что путь остается неизменным от upstream
  • новая проверка вашего проекта работает, потому что система подмодулей получает его из вашей вилки в правой фиксации, но в пути к папке вверх по течению
  • вам не нужно знать, чтобы вручную взломать пути или возиться с инструментами go.

Подробнее

Comments

    Ничего не найдено.