Go'da çatallı paket içe aktarmayı kullanma


105

Adresinde bir deponuz olduğunu github.com/someone/repove onu çatalladığınızı varsayalım github.com/you/repo. Ana depo yerine çatalınızı kullanmak istiyorsunuz, bu nedenle

go get github.com/you/repo

Artık bu depodaki tüm içe aktarma yolları "bozuk" olacaktır, yani, depoda birbirine mutlak URL'ler aracılığıyla başvuran birden fazla paket varsa, bunlar çatala değil kaynağa başvuracaklardır.

Manuel olarak doğru yola klonlamanın daha iyi bir yolu var mı?

git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo

1
Çatallaşmadan önce kırılmamış olan yeni çataldaki hiçbir ithalat yolu bozulmayacaktır.
zzzz

11
Sizi hayal kırıklığına uğrattığım için üzgünüm ama bu doğru değil. İçe aktarmalarda bir alt pakete mutlak url'si üzerinden başvurulursa, bu içe aktarma çatalda kırılır (veya en azından yanlış pakete atıfta bulunur).
Erik Aigner

2
Örneğin goamz . Her yerde dahili referanslara sahiptir.
Erik Aigner

1
Bak ec2paketin - bu vardır launchpad.net/goamz/awsithalat. Hem, awshem de ec2paketler AYNI havuzunda bulunur, bu nedenle çatallandığında doğru pakete (çataldaki paket) başvurmaz.
Erik Aigner

1
Çatal, çatalın kaynağıyla aynı paketi referans alacaktır. Bunda yanlış olan ne? Çatal derlenecek, inşa edecek, önceki ile aynı şeyi yapacak. Öyleyse 'yanlış paket'in tanımı nedir? Go dilinin, aynı derleme sistemi gibi, havuzlar konusunda hiçbir farkındalığına sahip olmadığını , yalnızca paketler olduğunu unutmayın.
zzzz

Yanıtlar:


85

Çekme isteklerini işlemek için

  • Çatal bir depo github.com/someone/repoiçingithub.com/you/repo
  • orijinal kodu indirin: go get github.com/someone/repo
  • orada ol: cd "$(go env GOPATH)/src"/github.com/someone/repo
  • çatalınıza yüklemeyi etkinleştirin: git remote add myfork https://github.com/you/repo.git
  • değişikliklerinizi deponuza yükleyin: git push myfork

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

Projenizde bir paket kullanmak için

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


hangi klasörden yapmalıyım git remote add? çataldan klon? orijinalden klon mu? içinden gitmek mi?
turlar

1
@lapots, komutu orijinal depoda çalıştırın (yani $ GOPATH / src / github.com / somone / repo)
will7200

Uzun zaman önce çatallanmış bir depoya değişiklik eklemek istersem ne olur?
NA

65

Go modülleri kullanıyorsanız . replaceDirektif kullanabilirsiniz

replaceYönergesi veya bir akraba veya mutlak dosya yolu ile yerel dosya sisteminde (başka yerde GitHub'dan veya) VCS bulunan başka modül olabilecek başka bir ithalat yolu tedarik sağlar. replaceDirektifin yeni içe aktarma yolu , gerçek kaynak kodundaki içe aktarma yollarını güncellemeye gerek kalmadan kullanılır.

Böylece go.mod dosyanızda aşağıdakileri yapabilirsiniz

module github.com/yogeshlonkar/openapi-to-postman

go 1.12

require (
    github.com/someone/repo v1.20.0
)

replace github.com/someone/repo => github.com/you/repo v3.2.1

deponuzda v3.2.1etiket nerede . CLI aracılığıyla da yapılabilir

go mod edit -replace="github.com/someone/repo@v0.0.0=github.com/you/repo@v1.1.1"

4
harika çalıştı. Sanırım bunun daha fazla oy almamasının tek nedeni, insanların henüz go modüllerini kullanmaması. Ayrıca bu numarayı, üzerinde çalıştığım yerel düzenlemelerin olduğu iş istasyonumdaki başka bir dizine bir dosya konumunu işaret etmek için kullandım. Yerel düzenlemelerimi github'a aktardıktan sonra "değiştir" satırımı kaldırırdım.
lazieburd

^% 100 katılıyorum. İnsanlara oy verin.
Andrew Arrow

2
oh, ama "usta" benim için işe yaramadı. Orada v0.0.1 veya belirli bir sürüm yazmak zorunda kaldım.
Andrew Arrow

1
Sen Ayrıca go mod edit -replace doğrudan komut satırında: go mod edit -replace="github.com/someone/repo@v0.0.0=github.com/you/repo@v1.1.1". Her ikisi @v...de isteğe bağlıdır.
Joel Purra

Bir go.mod.localveya go.mod.devkimin rolü yerel kalkınmanın ithal yolunun yerini alması harika olmaz mıydı ? Demek istediğim, çirkin "değiştirmeyi" kaldırmayı asla unutmazsınız çünkü zorunda kalmazsınız.
Manuel

21

Bunu çözmenin bir yolu, Ivan Rave ve http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html - çatallaşmanın yolu.

Bir diğeri, golang davranışını geçici olarak çözmektir . Siz go get, golang dizinlerinizi arşiv URI'sindekiyle aynı adla düzenler ve sorun burada başlar.

Bunun yerine, kendiniz git cloneyayınlarsanız, deponuzu dosya sisteminize orijinal deponun adını taşıyan bir yolda klonlayabilirsiniz.

Orijinal deponun içinde olduğunu varsayarsak github.com/awsome-org/toolve siz onu çatallayabilirsiniz github.com/awesome-you/tool, şunları yapabilirsiniz:

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

golang bu depoya devam etmekten son derece mutlu ve aslında awesome-orggit remote olduğu sürece bazı üst dizinin ismine sahip olmasını umursamıyor awesome-you. Tüm içe aktarmalar awesome-org, yerel çalışma kümeniz olan yeni oluşturduğunuz dizin aracılığıyla yeniden taşınır.

Daha uzun süre, lütfen blog gönderime bakın: GitHub'da Golang depolarını çatallamak ve içe aktarma yolunu yönetmek

düzenleme : sabit dizin yolu


3
Bunun "en iyi" çözüm olduğuna katılıyorum. Ancak, Go uygulamasını bir Docker konteynerinde çalıştırırken insanların bu iş akışını nasıl yönettiğini görmek gerçekten güzel olurdu. Golang öğreniyorum ve bir Çekme İsteği oluşturmadan önce test ederek bu baş ağrısıyla karşılaştığımda kullandığım bir kütüphaneye küçük bir özellik eklemek istedim.
Joakim

6

Çatalınız sadece geçiciyse (yani birleştirme niyetindeyseniz), geliştirmenizi yerinde yapın, örn $GOPATH/src/launchpad.net/goamz.

Daha sonra git remote, yukarı akış havuzunu orijinal havuzunuz yerine kendi havuzunuz yapmak için sürüm kontrol sisteminin özelliklerini (örneğin ) kullanırsınız.

Başkalarının deponuzu kullanmasını zorlaştırır, go getancak yukarı akışa entegre edilmesi çok daha kolaydır.

Aslında goamz lp:~nick-craig-wood/goamz/goamziçin tam olarak bu şekilde geliştirdiğim bir depom var . Belki yazar onu bir gün birleştirir!


1
Yani bunu yapmanın sonuçlarını anlıyorum, eğer bu rotaya gidersem, birisi repomdan bir şey yaptığında go get, tüm ithalat beyanlarım ve bunlar yine de yansıyacak github.com/original_authorve dolayısıyla bozulacaktır ... doğru mu?
parker.sikand

@ parker.sikand evet bu doğru. Bu teknik, kullanmak için değil, yukarı akışla birleştirmek istediğiniz şeyler için en iyisidir. Paketi kalıcı olarak çatallamayı düşünüyorsanız, diğer cevap tekniğini kullanın.
Nick Craig-Wood

4

İşte bunun herkes için işe yaraması için bir yol:

"My / repo" ya çatallamak için github kullanın (sadece bir örnek):

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

Kodu daha iyi hale getirdiğinizde her seferinde tekrarlayın:

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

Neden? Bu, herhangi birinin go getçalıştığı deponuza sahip olmanızı sağlar . Ayrıca, çekme isteği için iyi olan bir dalı korumanıza ve geliştirmenize de olanak tanır. "Satıcı" ile gitmeyi şişirmez, geçmişi korur ve inşa araçları bunu anlamlandırabilir.


Küçük bir düzeltme: gidin github.com/golang/tools/cmd/gomvpkg/main.go komutunu çalıştırın ve bu komut .git hareket eder, bu nedenle başka bir yere kaydedin ve daha sonra geri yükleyin.
user1212212


3

Bunun yanıtı, bir depoyu birden fazla paketle çatallaştırırsanız, ilgili tüm içe aktarma yollarını yeniden adlandırmanız gerekeceğidir. Bu büyük ölçüde iyi bir şey çünkü tüm bu paketleri çatalladınız ve içe aktarma yolları bunu yansıtmalıdır.


3
Bir Go projesine ilk katkım olarak bunu teşhis ettiğimi kabul ettiğimden daha fazla zaman yandım. "Yeni işlevleri kapsamlı bir şekilde test etmek için yazdığım testler de dahil olmak üzere tüm testler geçti. Sorun nedir? Yeni başlayanlar için bu tökezleyen noktayı hafifletmek için mevcut herhangi bir aletten haberdar mısınız?
Sage Mitchell

3
Ben bunu anladım kez kullanarak kolayca çözüldü find, xargsve sed, ama sürekli herkes için çalıştığını bir ağrısız bir iş akışına sahip yardımcı olacaktır.
Sage Mitchell

@JakeMitchell gomvpkgyeniden adlandırmaları daha kolay / daha iyi yapabilir. go get golang.org/x/tools/cmd/gomvpkgsonra gomvpkg -help.
Dave C

3
Bu cevap bana tamamen uygulanamaz geliyor. Çatallı bir projeden proje dosyalarını yerleştirmek çılgınlık mı? Bir çekme isteği oluşturduğunuzda ne yaparsınız? Ivan Rave'nin cevabı bana çok daha iyi bir çözüm gibi görünüyor.
Ivan P

8
Hala Go-lang böyle mi çalışıyor? Bu çok çılgınca, komik değil ... Ya yukarı akıntı dostu ya da mansap dostu olun, ama ikisi birden değil. Benim çok mütevazı olmayan düşünceme göre, muhtemelen çok fazla çapraz projede işbirliği yapmayan insanlar tarafından yapılan büyük bir tasarım hatası. #FAIL #GOLANG
Niclas Hedhman

1

Bu süreci otomatikleştirmek için küçük bir senaryo yazdım. Sen benim daha fazla ayrıntı bulabilirsiniz bloga sizin bash "gofork" gibi bir komut eklemek için.

function gofork() {
  if [ $# -ne 2 ] || [ -z "$1" ] || [ -z "$2" ]; 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 $1 and replace $2 in GOPATH: $GOPATH"
   go get $1
   go get $2
   currentDir=$PWD
   cd $GOPATH/src/$1
   remote1=$(git config --get remote.origin.url)
   cd $GOPATH/src/$2
   remote2=$(git config --get remote.origin.url)
   cd $currentDir
   rm -rf $GOPATH/src/$2
   mv $GOPATH/src/$1 $GOPATH/src/$2
   cd $GOPATH/src/$2
   git remote add their $remote2
   echo Now in $GOPATH/src/$2 origin remote is $remote1
   echo And in $GOPATH/src/$2 their remote is $remote2
   cd $currentDir
}

export -f gofork

4. satırda mı golangdeğiştirilmelidir gofork?
Dan Tenenbaum

iyi görüldü! düzelt!
heralight

1

Tedarikçiliği ve alt modülleri birlikte kullanın

  1. Kitaplığı github'da çatallayın (bu durumda go-mssqldb)
  2. Bir ekleme submodule senin içine çatal klonlar satıcı klasöründe ama yukarı repo yolu vardır
  3. importKaynak kodunuzdaki ifadelerinizi satıcı klasörünü işaret edecek şekilde güncelleyin ( vendor/önek dahil değil ). Örneğin vendor/bob/lib=>import "bob/lib"

Örneğin

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

mygithubuser=timabell
upstreamgithubuser=denisenkom
librepo=go-mssqldb

git submodule add "git@github.com:$mygithubuser/$librepo" "vendor/$upstreamgithubuser/$librepo"

Neden

Bu, duyduğum ve bunu kendim çözmeye çalışırken karşılaştığım tüm sorunları çözüyor .

  • Kitaplıktaki dahili paket referansları artık çalışır çünkü yol yukarı akıştan değişmez
  • Projenizin yeni bir kontrolü çalışır, çünkü alt modül sistemi onu çatalınızdan doğru kaydetmede, ancak yukarı akış klasör yolunda alır.
  • Yolları manuel olarak kesmek veya go takımıyla uğraşmak zorunda değilsiniz.

Daha fazla bilgi


0

sizin de Gopkg.tomldosyaya Aşağıda, bu bloğu ekleyin

[[constraint]]
  name = "github.com/globalsign/mgo"
  branch = "master"
  source = "github.com/myfork/project2"

Böylece çatal project2yerine çatal kullanacakgithub.com/globalsign/mgo


Gopkg.tomlDosya sadece tarafından kullanılan dephangi bu soru hiç söz etmez. Yeni Go projeleri bunun yerine Go modüllerini kullanmalıdır (ve IMO mevcut dep tabanlı projeler de taşınmalıdır).
Dave C

Bu dep özelliğini bilmiyordum ve cevabınız kesinlikle bana yardımcı oldu :)
Veger

0

Size go get -fçatallı bir depo almak için komutu kullanabilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.