Có mã nguồn cho một dự án Go bên ngoài GOPATH là một ý tưởng tồi


32

Tôi đang làm việc trên một dự án mới bằng cách sử dụng Go và tất cả chúng ta đều mới với Go. Chúng tôi đang theo cấu trúc thư mục go tiêu chuẩn và có tất cả mã theo

$ GOPATH / src / github.com / tên công ty / tên dự án

đó cũng là gốc của kho git

Bố cục đường dẫn được đề xuất tiêu chuẩn có vẻ hơi lạ, đặc biệt nếu chúng tôi đang làm việc với một dự án đa ngôn ngữ, ví dụ: phần phụ trợ dựa trên phần còn lại / http và phần đầu html / javascript. Trong trường hợp đó, tôi có thể muốn cấu trúc dự án của mình trông như thế này:

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

Nhưng có thực sự cần thiết phải đặt mã bên trong GOPATH không?

Như một nỗ lực, tôi đã tạo ra một chương trình nhỏ trong đó mã nguồn nằm ngoài GOPATH. Tôi có thể dễ dàng chia dự án thành các gói, vì vậy maingói có thể tham chiếu một foogói trong một foo/thư mục bằng cách sử dụng import "./foo".

Theo như tôi có thể thấy, có hai điều không phù hợp với tôi:

  • Mã khác không thể nhập mã này. Đây không phải là một vấn đề vì chúng tôi đang xây dựng một dịch vụ dành riêng cho công ty.
  • Tôi không thể sử dụng go installđể cài đặt nó. Đây cũng không phải là một vấn đề. Đường ống xây dựng cài đặt công cụ.

Tuy nhiên, nó cho phép máy chủ xây dựng không có không gian làm việc của nó được đặt bên trong GOPATH

Là một cách tiếp cận như vậy không được khuyến khích? Nếu vậy, tại sao vậy?

Có tác dụng phụ tiêu cực nào khác so với hai tôi đã liệt kê?

Hãy nhớ rằng đây là một dự án riêng cho một công ty, không phải mã nguồn mở công khai.

Việc tách dự án thực tế khỏi GOPATH có vẻ hấp dẫn, nhưng người ta nên cẩn thận trong việc phá vỡ các quy tắc khi bạn ở trên sân khấu Shu

Câu trả lời:


12

Bạn không cần phải sử dụng GOPATH, nhưng sau đó bạn bỏ lỡ tất cả các công cụ hay mà bạn nhận được từ golệnh. Tất cả họ đều mong đợi mã nằm trong hệ thống phân cấp GOPATH tiêu chuẩn.

Bạn đã đề cập go install, nhưng cũng go test(và go test -covercông cụ bảo hiểm tốt ) sẽ không hoạt động go get, cho phép bạn tải xuống mã từ xa sẽ ghi mọi thứ vào GOPATH, vì vậy bạn sẽ cần sao chép mọi thứ.

Chắc chắn, bạn có thể thay thế tất cả bằng make / scons / cmake / bất cứ điều gì và hoàn thành công việc và nó có thể sẽ hoạt động cho môi trường của bạn, nhưng công việc bổ sung của nó có thể được thực hiện bởi gocông cụ.


9

(từ chối trách nhiệm: Tôi thích thiết kế những thứ như thế này nhưng tôi chưa quen với Go, tôi chưa từng thử nó trong thực tế)

Ý tưởng: Tại sao không phải cả hai?

Có hai tùy chọn cực khả dụng nếu bạn đưa symlinking vào tài khoản:

(A) Mã trong src, được liên kết với không gian làm việc

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

(B) Mã trong không gian làm việc, được liên kết với 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

Tôi nghiêng về phía "A" vì:

  • tất cả các nguồn của bạn sống gần nhau về thể chất,
  • projectname có thể dễ dàng có repo riêng hoặc bạn có thể có một repo cho toàn bộ dự án của bạn,
  • bạn có thể giữ toàn bộ go_workspacekhông đảo ngược và khởi tạo nó thông qua một bước thực hiện (sử dụng godepsau đó liên kết dự án)

1
Nó phải là "A", vì với "B" go sẽ phàn nàn "go install: không có vị trí cài đặt cho thư mục {dir} bên ngoài GOPATH".
OJFord

2

Cập nhật 2019

Bạn không cần phải lưu trữ dự án của bạn dưới GOPATHnữa.

Chỉ cần đặt nó trong bất kỳ thư mục bên ngoài GOPATH. Sau đó gõ:

go mod init github.com/youruser/yourproject

Bạn sẽ tốt để đi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.