Dizinleri paket adlarıyla eşleştirme ihtiyacı konusunda kabul edilen yanıt hala doğru olsa da, GOPATH kullanmak yerine gerçekten Go modüllerini kullanmaya geçmeniz gerekir. Bu sorunla karşılaşan yeni kullanıcıların, artık modası geçmiş olan GOPATH (benim gibi) kullanımından bahsedilmesi konusunda kafaları karışabilir. Bu yüzden, bu sorunu gidermeye çalışacağım ve Go modüllerini kullanırken bu sorunu önlemeyle ilgili rehberlik sağlayacağım.
Go modüllerine zaten aşina iseniz ve bu sorunu yaşıyorsanız, göz ardı edilmesi veya unutulması kolay olan bazı Go kurallarını kapsayan aşağıdaki daha özel bölümlerime geçin.
Bu kılavuz, Go modülleri hakkında bilgi verir: https://golang.org/doc/code.html
Go modülleri ile proje organizasyonu
O makalede belirtildiği gibi Go modüllerine geçtikten sonra, proje kodunu açıklandığı gibi düzenleyin:
Bir arşiv, bir veya daha fazla modül içerir. Modül, birlikte yayımlanan ilgili Go paketlerinin bir koleksiyonudur. Bir Go deposu, genellikle havuzun kökünde bulunan tek bir modül içerir. Burada go.mod adlı bir dosya modül yolunu bildirir: modül içindeki tüm paketler için içe aktarma yolu öneki. Modül, başka bir go.mod dosyası (varsa) içeren bir sonraki alt dizine kadar, go.mod dosyasını içeren dizindeki paketleri ve bu dizinin alt dizinlerini içerir.
Her modülün yolu yalnızca paketleri için bir içe aktarma yolu öneki işlevi görmez, aynı zamanda go komutunun onu indirmek için nereye bakması gerektiğini de belirtir. Örneğin, golang.org/x/tools modülünü indirmek için, go komutu https://golang.org/x/tools (burada daha fazla açıklanmıştır) tarafından belirtilen depoya başvurur .
İçe aktarma yolu, bir paketi içe aktarmak için kullanılan bir dizedir. Bir paketin içe aktarma yolu, modül içindeki alt diziniyle birleştirilen modül yoludur. Örneğin, github.com/google/go-cmp modülü cmp / dizininde bir paket içerir. Bu paketin içe aktarma yolu github.com/google/go-cmp/cmp şeklindedir. Standart kitaplıktaki paketlerin modül yolu öneki yoktur.
Modülünüzü şu şekilde başlatabilirsiniz:
$ go mod init github.com/mitchell/foo-app
Kodunuzun oluşturulması için github.com'da bulunması gerekmez. Ancak, modüllerinizi eninde sonunda yayınlanacaklar gibi yapılandırmak en iyi uygulamadır.
Bir paket almaya çalışırken ne olduğunu anlamak
Burada bir paket veya modül almaya çalıştığınızda ne olacağını anlatan harika bir makale var: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16
Paketin nerede saklandığını ve nerede olacağını tartışıyor Go modüllerini zaten kullanıyorsanız neden bu hatayı aldığınızı anlamanıza yardımcı olur.
İçe aktarılan işlevin dışa aktarıldığından emin olun
Başka bir dosyadan bir işleve erişmede sorun yaşıyorsanız, işlevinizi dışa aktardığınızdan emin olmanız gerektiğini unutmayın. Sağladığım ilk bağlantıda açıklandığı gibi, bir işlevin dışa aktarılması ve diğer paketlere içe aktarılmaya uygun hale getirilmesi için büyük harfle başlaması gerekir.
Dizin isimleri
Diğer bir kritik ayrıntı da (kabul edilen cevapta bahsedildiği gibi), dizin adlarının paketlerinizin adlarını tanımlamasıdır. (Paketiniz adları dizini adlarla eşleşmesi gerekir.) Burada bu örnekler görebilirsiniz: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc
ile Bununla birlikte, main
yönteminizi içeren dosya (yani başvurunuzun giriş noktası) bu gereklilikten muaftır.
Örnek olarak, böyle bir yapı kullanırken ithalatımla ilgili sorunlar yaşadım:
/my-app
├── go.mod
├── /src
├── main.go
└── /utils
└── utils.go
Ben kodu almak edemedi utils
benim içine main
paketin.
Ancak, main.go
aşağıda gösterildiği gibi kendi alt dizinine koyduğumda , içe aktarmalarım gayet iyi çalıştı:
/my-app
├── go.mod
├── /src
├── /app
| └── main.go
└── /utils
└── utils.go
Bu örnekte, go.mod dosyam şöyle görünür:
module git.mydomain.com/path/to/repo/my-app
go 1.14
Bir referans ekledikten sonra main.go'yu kaydettiğimde, IDE'm referansı paketime şu şekilde utils.MyFunction()
otomatik olarak çekti:
import "git.mydomain.com/path/to/repo/my-app/src/my-app"
(Golang uzantısıyla VS Code kullanıyorum.)
İçe aktarma yolunun pakete alt dizini içerdiğine dikkat edin.
Özel bir depo ile uğraşmak
Kod özel bir deponun parçasıysa, erişimi etkinleştirmek için bir git komutu çalıştırmanız gerekir. Aksi takdirde başka hatalarla karşılaşabilirsiniz Bu makale özel Github, BitBucket ve GitLab depoları için bunun nasıl yapılacağını anlatır: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4
Bu konu ayrıca burada tartışılmaktadır: Özel bir depoyu "almaya gitmenin" doğru yolu nedir?