Yeni Go programcıları genellikle temel go build komutunun ne yaptığını bilmiyor veya kafaları karışıyor.
go build
Ve go install
komutları tam olarak ne oluşturur ve sonucu / çıktıyı nereye koyarlar?
Yanıtlar:
go
Komutun 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 install
derler 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 install
komutu geçici bir dizinde oluşturur ve sonra ona taşır $GOPATH/bin
.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ı net
paketi 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
.
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.mod
dosya (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ü ( go
komutun ç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 install
aynı 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 install
otomatik, 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.
go
Araç 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 install
tarafı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?
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 build
Vego install
komutları 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 install
Go 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 install
inş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
" kendisininmyprog
olduğu kadar tüm bağımlılıklarının da tamamen yeniden kurulmasını zorlayacakmyprog
, ancak yalnızcamyprog
yü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 birmyprog
derleyici optimizasyonları olmadan oluşturulmuştur, ancak artık paketlerimyprog
standart kitaplıktan derleyici optimizasyonları olmadan kullanır.
go build
, do get
s? 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?
go.mod
dosya var mı?
go version go1.11.4 linux/amd64
. Go.mod hakkında bilmiyorum. Yeniden https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go
inş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.