Memiliki kode sumber untuk proyek Go di luar GOPATH adalah ide yang buruk


33

Saya sedang mengerjakan proyek baru menggunakan Go, dan kita semua baru untuk Go. Kami mengikuti struktur direktori go standar, dan memiliki semua kode di bawahnya

$ GOPATH / src / github.com / companyname / projectname

yang juga merupakan akar dari repositori git

Layout path standar yang direkomendasikan memang terasa agak aneh, terutama jika kita sedang mengerjakan proyek multi-bahasa, misal Goend rest / http backend berbasis Go, dan front-end html / javascript. Dalam hal ini saya mungkin ingin struktur proyek saya terlihat seperti ini:

/
  doc/
  src/
    server/
      main.go
      module1/
        module.go
    client/
      index.html
  Makefile

Tetapi apakah sebenarnya perlu untuk menempatkan kode di dalam GOPATH?

Sebagai upaya saya membuat program kecil di mana kode sumber berada di luar GOPATH. Saya dapat dengan mudah membagi proyek menjadi paket-paket, sehingga mainpaket tersebut dapat merujuk foopaket foo/menggunakan folder import "./foo".

Sejauh yang saya bisa lihat, ada dua hal yang melarang saya:

  • Kode lain tidak dapat mengimpor kode ini. Ini bukan masalah karena kami sedang membangun layanan khusus untuk perusahaan.
  • Saya tidak dapat menggunakannya go installuntuk menginstalnya. Ini juga bukan masalah. Pipeline build memasang alat.

Namun itu memungkinkan server build untuk tidak menempatkan ruang kerjanya di dalam GOPATH

Apakah pendekatan seperti itu tidak disarankan? Jika demikian, mengapa demikian?

Apakah ada efek samping negatif selain dari yang saya sebutkan?

Ingatlah bahwa ini adalah proyek pribadi untuk perusahaan, bukan kode sumber terbuka publik.

Melepaskan proyek sebenarnya dari GOPATH tampaknya menggoda, tetapi orang harus berhati-hati dalam melanggar aturan ketika Anda berada di tahap Shu

Jawaban:


13

Anda tidak diharuskan untuk menggunakan GOPATH, tetapi kemudian Anda kehilangan semua alat bagus yang Anda dapatkan dari goperintah. Mereka semua mengharapkan kode berada dalam hierarki GOPATH standar.

Anda sebutkan go install, tetapi juga go test(dan go test -coveralat cakupan yang bagus ) tidak akan berfungsi go get, yang memungkinkan Anda untuk mengunduh kode jarak jauh akan menulis semuanya ke GOPATH, jadi Anda perlu menyalin semuanya.

Tentu, Anda bisa menggantinya dengan make / scons / cmake / apa pun dan menyelesaikan sesuatu dan itu mungkin akan bekerja untuk lingkungan Anda, tetapi pekerjaan ekstra yang bisa dilakukan oleh goalat.


9

(Penafian: Saya suka merancang hal-hal seperti ini, tetapi saya masih baru untuk Go, saya belum mencobanya dalam praktik)

Ide: Mengapa tidak keduanya?

Ada dua opsi kutub yang tersedia jika Anda mempertimbangkan symlinking:

(A) Kode dalam src, disinkronkan ke ruang kerja

/
  doc/
  src/
    server/
      projectname/
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname -> ../../../src/server/projectname
      github.com/
        someone/
          library/
    bin/
    pkg/
  Makefile

(B) Kode di ruang kerja, disinkronkan dengan src

/
  doc/
  src/
    server/
      projectname -> ../../go_workspace/src/companyname/projectname
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname/
      github.com/
        someone/
          somelib/
    bin/
    pkg/
  Makefile

Saya akan condong ke arah "A" karena:

  • semua sumber Anda hidup berdekatan secara fisik,
  • projectname dapat dengan mudah memiliki repo sendiri, atau Anda dapat memiliki satu repo untuk seluruh proyek Anda,
  • Anda dapat menjaga seluruh go_workspacetidak berversi dan menginisialisasi melalui langkah make (menggunakan godepkemudian menghubungkan proyek)

1
Itu harus "A", karena dengan "B" go akan mengeluh "go install: tidak ada lokasi instal untuk direktori {dir} di luar GOPATH".
OJFord

5

Pembaruan 2019

Anda tidak perlu lagi menyimpan proyek Anda di bawah GOPATH.

Masukkan ke dalam direktori di luar GOPATH. Kemudian ketik:

go mod init github.com/youruser/yourproject

Anda akan baik untuk pergi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.