Birden çok dosyadan oluşan Go programı nasıl derlenir?


89

Üç dosyadan oluşan küçük bir programım var, hepsi aynı pakete (main) ait, ancak "go build main.go" yaptığımda yapı başarılı olmuyor. Yalnızca bir dosya (main.go) olduğunda, her şey yolunda gitti. Kodu ayırmak için biraz çaba sarf ettiğime göre, derleyici main.go'dan çıkarılan şeyleri bulamıyor ve bu diğer iki dosyaya (main.go ile aynı dizinde bulunan) koyamıyor gibi görünüyor. . Hangi "tanımlanmamış" tür "" hataları ile sonuçlanır.

Birden fazla dosyadan oluşan bu program nasıl derlenir?

Yanıtlar:


87

Yeni Yol ( Önerilen ):

Lütfen bu cevaba bir göz atın .

Eski yol:

Myprog adında bir program yazdığınızı varsayarsak:

Tüm dosyalarınızı bunun gibi bir dizine koyun

myproject/go/src/myprog/xxx.go

Ardından myproject/goGOPATH'a ekleyin

Ve koş

go install myprog

Bu şekilde, isterseniz myproject / go / src içine başka paketler ve programlar ekleyebilirsiniz.

Referans: http://golang.org/doc/code.html

(Bu belge yeni gelenler tarafından her zaman gözden kaçar ve genellikle ilk başta yanlış anlaşılır. Go takımı IMO'sunun en büyük ilgisini çekmelidir)


5
neden / go / 'dan kurtulup myproject / src' yi yapmıyorsunuz?
Alexander Mills

ayrıca, "go install myprog" proje kaynağını bir şekilde $ GOPATH konumuna yazdığını varsayıyorum? Bu doğru mu? eğer öyleyse, cevabın bir parçası olarak bu açıklamaya sahip olmak güzel olurdu
Alexander Mills

1
@AlexanderMills Yalnızca küçük projeler tek bir teknoloji kullanıyor.
Denys Séguret

2
@ DenysSéguret bunu kabul ettiğimden emin değilim, ama yine de bu basit projeler için, sadece başlama kısmını bırakabilirsiniz - insanlar, go şeyinin gerekli olduğunu varsayabilir ve bu gerekli değildir. Söyle bana, hangisi daha basit, git mi yoksa gitme mi? :)
Alexander Mills

1
Hala neden bu klasör yapısını anlamıyorum?
Madeo

67

main.goÖrneğin kodu 'den' e ayırdığınızda more.go, bu dosyayı go build/ go run/ 'ye go installde iletirsiniz .

Yani daha önce koştuysan

go build main.go

sen şimdi basitçe

go build main.go more.go

Daha fazla bilgi olarak:

go build --help

devletler:

Bağımsız değişkenler .go dosyalarının bir listesiyse, yapı bunları tek bir paketi belirten kaynak dosyaların listesi olarak değerlendirir.


Bildirim o go buildve go installfarklı go runilk iki devlet beklemek ki paket isimlerini ikincisi beklediği süre, argümanlar olarak dosyaları gidin . Bununla birlikte, ilk ikisi, go yüklemesinin yaptığı gibi go dosyalarını da kabul eder.

Merak ediyorsanız: build sadece buildpaketleri / dosyaları, installGOPATH'ınızda nesne ve ikili dosyalar üretecek ve runprogramınızı derleyip çalıştıracaktır.


6
Daha fazla dosya eklemeye devam etmek istemiyorsanız, şu normal ifadeyi kullanın: go run * .go
NateW

tamam teşekkürler, Go her zaman yalnızca bir çalıştırılabilir dosya yazar mı? Yürütülebilir dosyaları ayrı tutmaz (Java'daki gibi)?
Alexander Mills

@AlexanderMills windows yüzünden sanırım nix kullanıyor. veya en azından mingw.
Sergey Gorlanov

evet, MacOS kullanıyordum, ama belki de lanet olası Bash sürüm 3, Bash 4'e yükseltmem gerekiyor.
Alexander Mills

30

Sadece koşabilirsin

go build

proje klasörünüzde myproject / go / src / myprog

O zaman sadece yazabilirsin

./myprog

uygulamanızı çalıştırmak için


3
çıktı bir çalıştırılabilir değil, bir go nesnesidir.
user2284570

@ user2284570 sadece chmod +xbu dosyanın çalıştırılması için izin ekleyin
dalmate

21

Go 1.11+ artık GOPATH önerilmediği için yeni yöntem Go Modüllerini kullanıyor.

Diyelim ki şu adında bir program yazıyorsunuz simple:

  1. Bir dizin oluşturun:

    mkdir simple
    cd simple
    
  2. Yeni bir modül oluşturun:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. Tüm dosyalarınızı o dizine koyun.

  4. Son olarak şunu çalıştırın:

    go run .
    
  5. Alternatif olarak, onu oluşturarak çalıştırılabilir bir program oluşturabilirsiniz:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

Daha fazla bilgi için, okumak olabilir bu .

Go, 1.11'den beri burada önerildiği gibi sürümlü modüller için destek içerir. İlk prototip vgo, Şubat 2018'de duyuruldu. Temmuz 2018'de, sürümlü modüller ana Go deposuna indi. Go 1.14'te, modül desteğinin üretim kullanımına hazır olduğu kabul edilir ve tüm kullanıcıların diğer bağımlılık yönetimi sistemlerinden modüllere geçmesi teşvik edilir.


7

Kullanabilirsiniz

go build *.go 
go run *.go

her ikisi de çalışır da kullanabilirsiniz

go build .
go run .

6

Proje yapınıza bağlıdır. Ancak en basit olanı şudur:

go build -o ./myproject ./...

sonra koş ./myproject.

Proje yapınızın şuna benzediğini varsayalım

- hello
|- main.go

sonra proje dizinine gidip

go build -o ./myproject

sonra ./myprojectkabukta çalıştırın .

veya

# most easiest; builds and run simultaneously
go run main.go

ana dosyanızın bir alt dizine yerleştirildiğini varsayalım. cmd

- hello
|- cmd
 |- main.go

o zaman koşacaksın

go run cmd/main.go

3

Evet! Bu çok basit ve paket stratejisi burada devreye giriyor. bilgime ulaşmanın üç yolu var. klasör yapısı:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2 uyarı: adaptör yalnızca paket main ve sun dizinlerini içerebilir

  1. "adaptör" klasörüne gidin. Çalıştırmak:
    go build main.go
  1. "adaptör" klasörüne gidin. Çalıştırmak:
    go build main.go
  1. GOPATH / src'ye gidin, ana paketin göreli yolunu tanır, burada "myproject / adapter". Çalıştırmak:
    go build myproject/adapter

exe dosyası şu anda bulunduğunuz dizinde oluşturulacaktır.

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.