Saya telah menggunakan GOPATH
tetapi untuk masalah saat ini saya menghadapinya tidak membantu. Saya ingin dapat membuat paket yang khusus untuk proyek:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
Saya mencoba beberapa cara tetapi bagaimana saya bisa mulai package1.go
bekerja di dan binary1.go
atau binary2.go
sebagainya?
Sebagai contoh; Saya ingin dapat import "package1"
dan kemudian dapat menjalankan go build binary1.go
dan semuanya berfungsi dengan baik tanpa kesalahan dilemparkan bahwa paket tidak dapat ditemukan di GOROOT
atau GOPATH
. Alasan mengapa saya memerlukan fungsionalitas semacam ini adalah untuk proyek skala besar; Saya tidak ingin harus merujuk beberapa paket lain atau menyimpannya dalam satu file besar.
.go
file dalam direktori tunggal adalah bagian dari paket yang sama, dan Anda tidak perluimport
file dalam paket yang sama (yaitu direktori yang sama). Anda menyebutkan bekerja di luar GOPATH, yang merupakan salah satu kemampuan sistem modul Go yang baru. Jawaban ini mencakup struktur modul, mengimpor paket lokal, mengatur paket dalam suatu modul, apakah memiliki beberapa modul dalam repositori tunggal, dll.git/repo/to/my/project
path? Saya hanya tidak melihat alasan mengapa ada orang yang menginginkan perilaku ini. Bagaimana jika Anda memindahkan proyek Anda ke lokasi lain (yaitu gambar Docker), Anda perlu mengubah semua jalur lagi? Saya mencari jawaban mengapa ini sangat rumit.Jawaban:
Ringkasan manajemen ketergantungan Go:
vgo
jika versi go Anda adalah:x >= go 1.11
dep
atauvendor
jika versi go Anda adalah:go 1.6 >= x < go 1.11
x < go 1.6
Sunting 3: Go 1.11 memiliki fitur
vgo
yang akan digantidep
.Untuk menggunakan
vgo
, lihat dokumentasi Modul . TLDR di bawah ini:Metode ini membuat file yang disebut
go.mod
di direktori proyek Anda. Anda kemudian dapat membangun proyek Anda dengango build
. JikaGO111MODULE=auto
diatur, maka proyek Anda tidak dapat masuk$GOPATH
.Sunting 2: Metode pembatalan masih valid dan berfungsi tanpa masalah.
vendor
sebagian besar merupakan proses manual, karena inidep
danvgo
dibuat.Sunting 1: Sementara cara lama saya berfungsi, ini bukan lagi cara yang "benar" untuk melakukannya. Anda harus menggunakan kemampuan vendor
vgo
,, ataudep
(untuk saat ini) yang diaktifkan secara default di Go 1.6; lihat . Anda pada dasarnya menambahkan paket "eksternal" atau "tergantung" di dalamvendor
direktori; saat dikompilasi, kompiler akan menggunakan paket-paket ini terlebih dahulu.Ditemukan. Saya dapat mengimpor paket lokal dengan
GOPATH
membuat subfolderpackage1
kemudian mengimpor denganimport "./package1"
inbinary1.go
danbinary2.go
skrip seperti ini:binary1.go
Jadi struktur direktori saya saat ini terlihat seperti ini:
Saya juga harus mencatat bahwa jalur relatif (setidaknya dalam go 1.5) juga berfungsi; sebagai contoh:
sumber
import "../package1"
Tidak ada yang namanya "paket lokal". Organisasi paket pada disk bersifat ortogonal untuk setiap hubungan orangtua / anak paket. Satu-satunya hierarki nyata yang dibentuk oleh paket adalah pohon dependensi, yang dalam kasus umum tidak mencerminkan pohon direktori.
Gunakan saja
dan jangan melawan sistem build tanpa alasan yang jelas. Menyimpan selusin karakter per impor dalam program non-sepele bukan alasan yang baik, karena, misalnya, proyek dengan jalur impor relatif tidak dapat diterima.
Konsep jalur impor memiliki beberapa properti penting:
Semua hal di atas hancur dengan menggunakan jalur impor relatif. Jangan lakukan itu.
PS: Ada beberapa tempat dalam kode lama dalam tes kompiler Go yang menggunakan impor relatif. ATM, ini adalah satu-satunya alasan mengapa impor relatif didukung sama sekali.
sumber
import "myproject/packageN"
.myproject
Apakah nama folder yang menampung proyek saya?Mungkin Anda mencoba memodulasi paket Anda. Saya berasumsi itu
package1
danpackage2
, dengan cara, bagian dari paket yang sama tetapi untuk keterbacaan Anda membaginya menjadi beberapa file.Jika case sebelumnya milik Anda, Anda bisa menggunakan nama paket yang sama ke dalam file-file multipel dan itu akan seperti jika ada file yang sama.
Ini adalah sebuah contoh:
add.go
kurangi.go
donothing.go
Saya bukan ahli Go dan ini adalah posting pertama saya di StackOveflow, jadi jika Anda memiliki saran, itu akan diterima dengan baik.
sumber
Saya memiliki masalah yang serupa dan solusi yang saya gunakan saat ini menggunakan modul Go 1.11. Saya memiliki struktur berikut
Dan saya dapat mengimpor package1 dan package2 dari project1 dan project2 dengan menggunakan
Setelah berlari
go mod init projects
. Saya dapat menggunakango build
dari direktori project1 dan project2 atau saya dapat melakukannyago build -o project1/exe project1/*.go
dari direktori proyek.Kelemahan dari metode ini adalah bahwa semua proyek Anda pada akhirnya berbagi daftar ketergantungan yang sama di go.mod. Saya masih mencari solusi untuk masalah ini, tetapi sepertinya itu mungkin mendasar.
sumber
Sejak diperkenalkannya go.mod , saya pikir manajemen paket lokal dan eksternal menjadi lebih mudah. Menggunakan go.mod , dimungkinkan untuk memiliki proyek di luar GOPATH juga.
Paket impor lokal:
Buat folder demoproject dan jalankan perintah berikut untuk menghasilkan file go.mod
go mod init demoproject
Saya memiliki struktur proyek seperti di bawah ini di dalam direktori demoproject .
Untuk tujuan demo, masukkan kode berikut dalam file model.go .
Di main.go , saya mengimpor model Karyawan dengan merujuk ke "demoproject / src / model"
Impor ketergantungan eksternal:
Jalankan saja
go get
perintah di dalam direktori proyek.Sebagai contoh:
Itu harus mencakup ketergantungan modul dalam file go.mod
https://blog.golang.org/using-go-modules
sumber
can't load package: package .: no Go files in...
(buka build di folder go.mod)Untuk menambahkan paket "lokal" ke proyek Anda, tambahkan folder (misalnya "package_name"). Dan letakkan file implementasi Anda di folder itu.
Dalam
package main
melakukan ini:Di mana
package_name
nama folder dan itu harus cocok dengan nama paket yang digunakan dalam file whatever_name1.go dan whatever_name2.go. Dengan kata lain semua file dengan sub-direktori harus dari paket yang sama.Anda selanjutnya dapat membuat sarang lebih banyak subdirektori selama Anda menentukan keseluruhan path ke folder induk dalam impor.
sumber
package myproject/package_name is not in GOROOT (/usr/lib/go-1.14/src/myproject/package_name)
Kamu bisa memakai
replace
foo / go.mod
foo / main.go
bar / go.mod
bar / fn.go
Mengimpor paket lokal sama seperti mengimpor pacakge eksternal
kecuali di dalam file go.mod Anda mengganti nama paket eksternal dengan folder lokal.
Path ke folder bisa penuh atau relatif "/ path / to / bar" atau "../bar"
https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive https://thewebivore.com/using-replace-in-go-mod-to-point -untuk-modul-lokal Anda /
sumber