Rumah  >  Artikel  >  pembangunan bahagian belakang  >  go build tidak berfungsi apabila digunakan dengan ruang kerja

go build tidak berfungsi apabila digunakan dengan ruang kerja

王林
王林ke hadapan
2024-02-08 21:06:181212semak imbas

与工作区一起使用时 go build 不起作用

editor php Banana di sini untuk memperkenalkan kepada anda masalah biasa, iaitu arahan go build tidak boleh berfungsi dengan baik apabila menggunakan ruang kerja. Masalah ini mungkin mengelirukan pembangun, kerana ruang kerja merupakan konsep yang sangat penting dalam bahasa Go, dan ketidakupayaan untuk menggunakan arahan go build dengan betul akan menjejaskan proses pembangunan dengan serius. Dalam artikel berikut, kami akan menganalisis punca masalah ini secara mendalam dan menyediakan penyelesaian untuk membantu pembangun berjaya menyelesaikan masalah ini.

Isi soalan

Berikut ialah struktur kod golang saya,

├── go.work
├── moda
│   ├── go.mod
│   └── main.go
├── go.mod
└── modb
    └── main.go

Masalahnya ialah saya hanya boleh membina binari untuk satu modul. Untuk membina modul lain, ia hanya berfungsi jika saya mengulas modul lain dalam go.work

Pergi kerja saya adalah seperti berikut,

go 1.19
use (
    ./moda
    .
)

Jadi apabila saya menggunakan go.work di atas untuk membina seperti berikut, ia berfungsi dengan baik,

go build -o test-binary -modfile ./moda/go.mod ./moda

Tetapi apabila saya cuba membina modul saya yang lain (iaitu modb/) seperti yang ditunjukkan di bawah,

go build -o test-binary1 -modfile ./go.mod ./modb

Saya mengalami ralat berikut,

directory modb is contained in a module that is not one of the workspace modules listed in go.work. you can add the module to the workspace using go work use .

Saya dah cuba guna go 工作 use tapi masih menghadapi masalah yang sama. Bolehkah sesiapa membantu saya menyelesaikan masalah ini?

Sunting 1:

Saya mempunyai projek yang memerlukan berbilang fail go.mod untuk memisahkan kebergantungan utama dan submodul, dan ketika itulah saya mula belajar tentang ruang kerja go yang sangat sesuai dengan kes penggunaan saya.

Struktur projek saya sama seperti yang dinyatakan di atas,

├── go.work
├── submodule
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── mainmodule
    └── main.go
├── go.mod
├── go.sum

Sekarang, apabila membina boleh laku untuk submodul, go build berfungsi dengan baik, tetapi apabila membina boleh laku untuk modul utama, import yang terdapat dalam submodule/go.mod juga ditambahkan pada modul boleh laku utama. Saya juga mengesahkan ini dengan go build -n.

Untuk mengelakkan penambahan import submodul pada modul boleh laku utama, saya menggunakan -modfile tetapi menggunakannya saya hanya boleh membina boleh laku untuk submodul dan bukan untuk modul utama.

kod sumber github

ps: Walaupun saya telah menambah kod sampel dalam github, saya tidak boleh mengeluarkan semula isu yang sama (import submodul ditambahkan pada modul utama) Tidak pasti sama ada ia disebabkan oleh import yang saya gunakan


Jawapan betul


Selepas berbincang dengan @arigatomanga kami mendapati bahawa kekeliruan itu disebabkan oleh pemilihan versi minimum (mvs) dalam ruang kerja. Ruang kerja ialah koleksi modul pada cakera yang digunakan sebagai modul utama semasa menjalankan Pilihan Versi Minimum (mvs) (Rujukan). Terima kasih kepada mvs, modul yang dibina dengan mod ruang kerja didayakan boleh menggunakan modul bergantung yang berbeza daripada modul yang dibina dengan mod ruang kerja dilumpuhkan.

Ini ialah gelagat ruang kerja yang didokumenkan dan tiada isu sekarang.

Kemas kini: Di ​​bawah ialah jawapan asal, memfokuskan pada bendera -modfile. Dalam mod ruang kerja dalam go1.21, bendera ini akan ditolak.

Anda mengalami ralat dalam alat pergi. Saya baru sahaja melaporkan isu ini di sini.

Mesej ralat dalam go1.20 adalah berbeza dan masih mengelirukan:

go: module example.com/m1 appears multiple times in workspace

Perbezaan itu diperkenalkan dengan commit cmd/go/internal/modload: ralat dikembalikan apabila laluan modul pendua antara modul dalam go.work, tetapi puncanya adalah sama: dalam mod ruang kerja, bendera -modfile tidak diperbetulkan berurusan dengan .

Kemas kini: Bahagian berikut tidak relevan sekarang. Sebelum memahami apa itu mvc, cuba menyekat mv menggunakan bendera -modfile adalah percubaan yang gagal.

Dalam laporan isu, saya mencadangkan menyekat bendera -modfile dalam mod ruang kerja. Tetapi anda berkata dalam ulasan bahawa anda memerlukan bendera ini.

Sebab untuk menggunakan -modfile 的原因是如果我为 ./src 构建二进制文件,即使在 ./moda 中存在的模块也会作为 ./src ialah jika saya membina binari untuk ./src, malah modul yang terdapat dalam ./moda akan muncul sebagai ./src code> dimuat turun dan dimuatkan sebagai sebahagian daripada binari, walaupun ia tidak sepatutnya disertakan

Tetapi mengikut dokumentasi cmd/go :

-fail mod

Dalam mod sedar modul, baca (dan mungkin tulis) ganti go.mod fail dan bukannya fail dalam direktori akar modul. Orang bernama "go.mod" mesti masih wujud untuk menentukan akar modul direktori, tetapi direktori itu tidak diakses. Apabila -modfile ditentukan, Juga menggunakan fail go.sum alternatif: laluannya diperoleh daripada -modfile flag, dengan memangkas sambungan ".mod" dan menambahkan ".sum".

Bendera

-modfile 标志用于替换模块根目录中的 go.mod digunakan untuk menggantikan fail go.mod dalam direktori akar modul. Tetapi dalam contoh anda, anda menyatakan fail yang sama seperti yang terdapat dalam akar modul. Jadi saya tidak begitu faham. Bolehkah anda mengemas kini soalan anda untuk menghuraikan bahagian ini? Demo sedang sibuk!

Atas ialah kandungan terperinci go build tidak berfungsi apabila digunakan dengan ruang kerja. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam