Go build ne inşa ediyor? (git derle ve git yükle karşılaştır)


Yanıtlar:


127

goKomutun ne yaptığı , onu "normal" bir paket için mi yoksa özel "main"paket için mi çalıştırdığımıza bağlıdır .

Paketler için

  • go build  paketinizi oluşturur ve ardından sonuçları atar .
  • go installderler daha sonra paketi dizininize yükler$GOPATH/pkg .

Komutlar için (paket main)

  • go build  komutu oluşturur ve sonucu geçerli çalışma dizininde bırakır .
  • go installkomutu geçici bir dizinde oluşturur ve sonra ona taşır $GOPATH/bin.

Neye geçilir go build?

Sen geçebilir paketler için go build, inşa etmek istediğiniz paketleri. Ayrıca .go, tek bir dizinden bir dosya listesi de iletebilirsiniz , bu daha sonra tek bir paketi belirten kaynak dosyaların listesi olarak değerlendirilir.

Paket (içe aktarma yolları) sağlanmadıysa, yapı geçerli dizine uygulanır.

Bir içe aktarma yolu bir veya daha fazla "..."joker karakter içerebilir (bu durumda bu bir kalıptır ). ...herhangi bir dize eşleşebilir, örneğin net/...maçları netpaketi ve alt klasörlerinden birinin olmak paketleri. Komuta

go build ./...

genellikle paketi geçerli klasörde ve tüm paketlerin tekrarlamasını sağlamak için kullanılır. Bir proje kökünde verilen bu komut tüm projeyi oluşturur.

Paketlerin belirlenmesi hakkında daha fazla bilgi için, çalıştırın go help packages.

Modüller ile ilgili olarak

Go modülleri için ön destek Go 1.11'de tanıtıldı ve modüller Go 1.13'ten başlayarak varsayılan hale geldi. Ne zamango bir go.moddosya (veya geçerli klasörün üst öğelerinden biri) içeren bir klasörden goçalıştırıldığında , araç modülü tanıyan modda çalışır (eski moda GOPATH modu denir ).

Modüle duyarlı modda, GOPATH artık bir derleme sırasında içe aktarımların anlamını tanımlamaz, ancak indirilen bağımlılıkları (GOPATH / pkg / mod içinde) ve yüklü komutları (GOBIN ayarlanmadıkça GOPATH / bin içinde) depolar.

Modül oluştururken, neyin inşa edileceği yapım listesi tarafından belirlenir . Derleme listesi başlangıçta yalnızca ana modülü ( gokomutun çalıştırıldığı dizini içeren modül ) içerir ve ana modülün bağımlılıkları yinelemeli olarak derleme listesine eklenir (bağımlılıkların bağımlılıkları da eklenir).

Daha fazla bilgi için koşun go help modules.


Temelde kullanabilirsiniz go build olarak, paketlerin (bağımlılıkları ile birlikte) oluşturulabileceğini kontrol ederken, go installaynı zamanda sonuçları (kalıcı olarak) $GOPATH.

go build her şey yolunda giderse sessizce sona erer ve paketler oluşturulamaz / derlenemezse size hata mesajları verir.

Ne zaman go aracı, sahip olduğu bağımlılıkları ne olursa olsun bir paket veya ikili, o da yükler yükler böylece çalışan go installotomatik, programınız (kamuya açık, "git gettable" paketler) bağlıdır paketleri kuracaktır.

Başlangıç ​​için resmi Go Code Yazma Nasıl Yazılır belgesini okuyun sayfasını okuyun.

goAraç hakkında daha fazla bilgi : Command go

Aşağıdaki komutu çalıştırarak da daha fazla yardım alabilirsiniz:

go help build

Ayrıca Go 1.5 ile başlamanın ( kaynak ) go installtarafından oluşturulan yürütülebilir dosyaları da kaldırdığını belirtmek gerekir :go build

'Go install' (bağımsız değişken olmadan, mevcut dizin anlamına gelir) başarılı olursa, 'go build' ile yazılan çalıştırılabilir dosyayı, varsa kaldırın. Bu, geride eski bir ikili dosya bırakmaktan kaçınır ...

Listeyi tamamlamak için, go run için uygulamanızı geçici bir klasörde derler ve bu çalıştırılabilir ikili dosyayı başlatır. Uygulama çıktığında, geçici dosyaları düzgün bir şekilde temizler.

Dave Cheney'den ilham alan soru go build build nedir?


1
tuhaf görünüyor, go install, önceden yüklenmiş olanla aynıysa yürütülebilir dosyayı güncellemiyor ... burada herhangi bir görüş var mı?
Scott Stensland

14

Paket için:

go build: paketinizi oluşturur ve ardından sonuçları atar

CL 68116 ve CL 75473 sayesinde Go 1.10'dan (Q1 2018) sonra bu doğru olmayacak . Burada referans verdiğim bu konuya bakın .

go buildVe go installkomutları tam olarak ne oluşturur?

Go aracı bir paket veya ikili dosya yüklediğinde, sahip olduğu bağımlılıkları da yükler, böylece go install komutunu çalıştırmak, programınızın bağlı olduğu paketleri de (genel kullanıma açık, "go gettable" paketleri) otomatik olarak yükler.

Aslında ... yeni önbelleğe ek olarak go installGo 1.10 ile de değişecek :

" go install" Komutu artık adlandırılmış paketlerin bağımlılıklarını yüklemiyor ( CL 75850 ) .

" go install foo" Çalıştırırsanız , yüklü olan tek şeyfoo .

Önceleri değişiyordu. Bağımlılıklar güncel değilse, " go install" herhangi bir bağımlılık da yükledi.
Bağımlılıkların örtük kurulumu " go install" sırasında kullanıcılar için çok fazla kafa karışıklığına ve baş ağrısına neden oldu, ancak daha önce artımlı yapıları etkinleştirmek gerekiyordu.
Artık değil.
Yeni " install what I said" anlambilimin çok daha anlaşılır olacağını düşünüyoruz, özellikle de birçok kullanıcının zaten beklediği hata raporlarından açıkça anlaşıldığı için.
" go install" Sırasında bağımlılıkların yüklenmesini zorlamak içingo install -i , " go build -i" ve " go test -i" ile benzer şekilde yeni " " yi kullanın .

Yeniden go installinşa edilmiş herhangi bir bağımlılığı kurmak için kullanılan " " gerçeği, çoğu zaman -a" force rebuild of all dependencies" ile bağlantılı olarak kafa karışıklığına neden oldu , bu da " " anlamına geliyordu .
Şimdi, " go install -a myprog" kendisinin myprogolduğu kadar tüm bağımlılıklarının da tamamen yeniden kurulmasını zorlayacak myprog, ancak yalnızca myprogyüklenecek. (Yeniden oluşturulan tüm bağımlılıklar, elbette, derleme önbelleğinde kaydedilecektir.)
Bu vakanın daha anlaşılır bir şekilde çalışmasını sağlamak, yeni içerik tabanlı bayatlık analizi ile birlikte özellikle önemlidir, çünkü bağımlılıkları eskisinden daha sık yeniden oluşturmak için iyi nedenler görür. Bu, "bağımlılıklarım neden yüklendi" kafa karışıklığını artırabilirdi.
Örneğin, " go install -gcflags=-N myprog" çalıştırırsanız , bu birmyprogderleyici optimizasyonları olmadan oluşturulmuştur, ancak artık paketlerimyprog standart kitaplıktan derleyici optimizasyonları olmadan kullanır.


Mu go build, do gets? Yapı hatam var cannot find package "github.com/spf13/cobra" in any of:…. Almasını nasıl söyleyeceğimi bilmiyorum. Açıkça almam gerekiyor mu?
ctrl-alt-delor

@ ctrl-alt-delor Hangi Go sürümüyle? Projenizin içinde go.moddosya var mı?
VonC

go version go1.11.4 linux/amd64. Go.mod hakkında bilmiyorum. Yeniden https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.goinşa ediyorum, tüm paketi yeni oluşturduğum ve bu örneği temel olarak kullandığım için ve çalışan daha basit bir sürüm oluşturduğum için (ancak bu kitaplığı kullanmadan) garip bir durum. Bıyık paketi ile nasıl kurulmadığını göremiyorum.
ctrl-alt-delor

@ ctrl-alt-delor böylece cobr satılır github.com/cbroglie/mustache/tree/master/cmd/mustache/vendor/… . GOPATH'ınız doğru ayarlanmış mı?
VonC

Bulduğun şeyi keşfettim. Paket bir satıcı alt dizinindedir: bu yüzden kurulmadı. Ancak neden şimdi inşa üzerine kurmadığını bilmiyorum. Veya satıcı dizininin nasıl kullanılacağı (dizinime kopyalarsam).
ctrl-alt-delor
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.