Cách phân phối các mô-đun GO

Tác giả đã chọn sự đa dạng trong quỹ công nghệ để nhận quyên góp như một phần của việc viết cho chương trình quyên góp.

Giới thiệu

Nhiều ngôn ngữ lập trình hiện đại cho phép các nhà phát triển phân phối các thư viện đã làm sẵn để người khác sử dụng trong các chương trình của họ và không ngoại lệ. Trong khi một số ngôn ngữ sử dụng kho lưu trữ trung tâm để cài đặt các thư viện này, hãy phân phối chúng từ cùng một kho lưu trữ điều khiển phiên bản được sử dụng để tạo các thư viện. GO cũng sử dụng một hệ thống phiên bản gọi là phiên bản ngữ nghĩa để hiển thị người dùng khi nào và những loại thay đổi nào đã được thực hiện. Điều này giúp người dùng biết liệu phiên bản mô-đun mới hơn có an toàn để nhanh chóng nâng cấp và giúp đảm bảo phần mềm của họ tiếp tục hoạt động với mô-đun sẽ chuyển tiếp.

Trong hướng dẫn này, bạn sẽ tạo và xuất bản một mô-đun mới, học cách sử dụng phiên bản ngữ nghĩa và xuất bản phiên bản ngữ nghĩa của mô-đun của bạn.

Điều kiện tiên quyết

  • Go phiên bản 1.16 hoặc lớn hơn được cài đặt, bạn có thể thực hiện bằng cách theo dõi chuỗi của chúng tôi, cách cài đặt và thiết lập một môi trường lập trình cục bộ để đi.
  • Một sự hiểu biết về các mô-đun GO, mà bạn có thể tìm thấy trong cách sử dụng Hướng dẫn Modules Go.
  • Làm quen với Git, mà bạn có thể nhận được bằng cách làm theo cách sử dụng Git: Hướng dẫn tham khảo.
  • Một kho lưu trữ github công cộng trống có tên pubmodule cho mô-đun được xuất bản của bạn. Để bắt đầu, hãy làm theo tài liệu GitHub để tạo một kho lưu trữ.

Tạo một mô-đun để xuất bản

Không giống như nhiều ngôn ngữ lập trình khác, mô-đun GO được phân phối trực tiếp từ kho lưu trữ mã nguồn mà nó nằm trong thay vì một kho gói độc lập. Điều này giúp người dùng dễ dàng tìm thấy các mô-đun được tham chiếu trong mã của họ và đối với các nhà bảo trì mô-đun để xuất bản các phiên bản mới của mô-đun của họ. Trong phần này, bạn sẽ tạo một mô-đun mới, mà sau đó bạn sẽ xuất bản để làm cho nó có sẵn cho những người dùng khác.

Để bắt đầu tạo mô-đun của bạn, bạn sẽ sử dụng git clone trên kho lưu trữ trống Bạn đã tạo như một phần của điều kiện tiên quyết để tải xuống ban đầu kho. Kho lưu trữ này có thể được nhân bản ở bất cứ nơi nào bạn muốn trên máy tính của mình, nhưng nhiều nhà phát triển có xu hướng có một thư mục cho các dự án của họ. Trong hướng dẫn này, bạn sẽ sử dụng một thư mục có tên Dự án . .git clone on the empty repository you created as part of the prerequisites to download the initial repository. This repository can be cloned anywhere youd like on your computer, but many developers tend to have a directory for their projects. In this tutorial, youll use a directory named projects.

Thực hiện các dự án và điều hướng đến nó:

  • Dự án MKDIR.
  • Dự án CD.

Từ Dự án Thư mục, chạy git clone để Sao chép kho lưu trữ của bạn cho máy tính của bạn: projects directory, run git clone to clone your repository to your computer:

  • git clone: ​​ your_github_username / pubmodule .Git

Nhân bản mô-đun sẽ tải xuống mô-đun trống của bạn vào pubmodule Thư mục bên trong thư mục. Bạn có thể nhận được cảnh báo rằng bạn đã nhân bản một kho lưu trữ trống, nhưng đây không phải là bất cứ điều gì để lo lắng về: pubmodule directory inside your projects directory. You may get a warning that youve cloned an empty repository, but this isnt anything to worry about:

Đầu ra.
Tổng số 0 [Delta 0], Tái sử dụng 0 [Delta 0], Gói tái sử dụng 0 Đến github.com: your_github_username /

.

  • Đầu ra ở trên cho thấy thẻ của bạn đã được đẩy và kho lưu trữ GitHub của bạn có v0.1.0 có sẵn cho người dùng mô-đun của bạn để tham khảo. pubmodule

Bây giờ bạn đã xuất bản phiên bản mới của mô-đun của mình bằng git thẻ , bất cứ khi nào người dùng chạy GO GET Để có phiên bản mới nhất của mô-đun của bạn, nó sẽ không còn tải xuống phiên bản dựa trên hàm băm cam kết mới nhất từ ​​nhánh mặc định. Khi một mô-đun có phiên bản phát hành, GO sẽ bắt đầu sử dụng các phiên bản đó để xác định cách tốt nhất để cập nhật mô-đun. Được ghép nối với phiên bản ngữ nghĩa, điều này cho phép bạn lặp lại và cải thiện các mô-đun của bạn đồng thời cung cấp cho người dùng của bạn một trải nghiệm nhất quán và ổn định. go mod init to create your new module and pass in the repositorys location as the module name. Ensuring the module name matches the repository location is important because this is how the go tool finds where to download your module when its used in other projects:

  • Phần kết luận your_github_username / pubmodule

Trong hướng dẫn này, bạn đã tạo một mô-đun GO công khai và xuất bản nó thành một kho lưu trữ GitHub để người khác có thể sử dụng nó. Bạn cũng đã sử dụng phiên bản ngữ nghĩa để xác định số phiên bản tốt nhất cho mô-đun của bạn. Cuối cùng, bạn đã mở rộng chức năng của mô-đun và, sử dụng phiên bản ngữ nghĩa, đã xuất bản phiên bản mới với sự tự tin rằng bạn sẽ không phá vỡ các chương trình phụ thuộc vào nó. go.mod :

Đầu ra.
GO: Tạo Go.MOD mới: mô-đun GitHub.com/ your_github_username / pubmodule . PubModule ' ... pubmodule

Cuối cùng, sử dụng trình soạn thảo văn bản yêu thích của bạn, chẳng hạn như nano , để tạo và mở tệp có cùng tên với kho lưu trữ của bạn: < / a> pubmodule .go . .nano, to create and open a file with the same name as your repository: pubmodule.go.

  • nano pubmodule .GO

Tên của tệp này có thể là bất cứ điều gì, nhưng sử dụng cùng tên với gói giúp dễ dàng biết cách bắt đầu từ đâu khi làm việc với gói không quen thuộc. Tuy nhiên, tên gói sẽ giống như tên kho lưu trữ của bạn. Bằng cách này, khi ai đó tham chiếu một phương thức hoặc loại từ gói của bạn, nó phù hợp với kho lưu trữ, chẳng hạn như pubmodule.myfination . Điều này sẽ giúp họ dễ dàng biết việc gói hàng đến từ trường hợp họ cần đến đâu trong trường hợp họ cần đề cập đến nó sau này.

Tiếp theo, thêm Xin chào Phương thức vào gói của bạn sẽ trả về chuỗi Xin chào, bạn! . Đây sẽ là chức năng có sẵn cho bất kỳ ai nhập gói của bạn: Hello method to your package that will return the string Hello, You!. This will be the function available to anyone importing your package:

projects/pubmodule/pubmodule.go

gói pubmodule chuỗi hello [] chuỗi { Trả lại "Xin chào, bạn!" Không GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod : GO sẽ xác nhận mô-đun của bạn được tạo bằng cách cho bạn biết nó đã tạo go.mod :

Bây giờ bạn đã tạo một mô-đun mới bằng GO MOD init Với một tên mô-đun phù hợp với kho lưu trữ từ xa của bạn [ < AI = 3> github.com/ your_github_username / pubmodule ]. Bạn cũng đã thêm một tệp có tên pubmodule.go vào mô-đun của bạn với một hàm có tên Xin chào Người dùng của mô-đun của bạn có thể gọi. Tiếp theo, bạn sẽ xuất bản mô-đun của mình để làm cho nó có sẵn cho người khác. pubmodule.myfination . Điều này sẽ giúp họ dễ dàng biết việc gói hàng đến từ trường hợp họ cần đến đâu trong trường hợp họ cần đề cập đến nó sau này. github.com/your_github_username/pubmodule]. Youve also added a file named pubmodule.go to your module with a function called Hello that users of your module can call. Next, youll publish your module to make it available to others.

Xuất bản mô-đun.

Khi bạn đã tạo một mô-đun cục bộ và bạn đã sẵn sàng để cung cấp nó cho người dùng khác, đã đến lúc xuất bản mô-đun của bạn. Vì các mô-đun GO được phân phối từ cùng một kho lưu trữ mã mà chúng được lưu trữ, bạn sẽ cam kết mã của mình vào kho Git cục bộ của mình và đẩy nó vào kho lưu trữ của bạn tại pubmodule your_github_username/pubmodule.

Trước khi bạn cam kết mã của mình với kho lưu trữ git cục bộ của mình, nên đảm bảo bạn sẽ không thực hiện bất kỳ tệp nào bạn không mong đợi để cam kết, sau đó sẽ được công bố công khai khi bạn nhấn mã đến GitHub. Sử dụng Git Trạng thái bên trong PubModule Thư mục sẽ hiển thị cho bạn tất cả Các tệp và thay đổi sẽ được cam kết: git status command inside the pubmodule directory will show you all the files and changes that will be committed:

  • trạng thái git.

Đầu ra sẽ trông giống với điều này:

Đầu ra.
Trên chi nhánh Main Không có cam kết nào Các tập tin không được kiểm duyệt: [Sử dụng "git thêm CD pubmodule CD pubmodule CD pubmodule CD pubmodule CD pubmodule CD pubmodule pubmodule .GO

bạn sẽ thấy go.mod Tệp GO MOD init lệnh được tạo và pubmodule .go Tệp bạn đã tạo Xin chào Chức năng trong. Tùy thuộc vào cách bạn tạo kho lưu trữ của mình, bạn có thể có một tên nhánh khác với đầu ra này. Phổ biến nhất, tên sẽ là chính hoặc Master . .go.mod file the go mod init command created, and the pubmodule.go file you created the Hello function in. Depending on how you created your repository, you may have a different branch name than this output. Most commonly, the names will be either main or master.

Khi bạn chắc chắn rằng bạn chỉ có các tệp bạn đang tìm kiếm, sau đó bạn có thể tạo các tệp bằng git thêm và cam kết chúng đến kho lưu trữ với git commit : pubmodule .GOgit commit:

  • git thêm.
  • git cam kết -m "cam kết ban đầu"

Đầu ra sẽ trông giống với điều này:

Đầu ra.
Trên chi nhánh Main Không có cam kết nào Các tập tin không được kiểm duyệt: CD pubmodule 931071d] Initial Commit 2 files changed, 8 insertions[+] create mode 100644 go.mod create mode 100644 pubmodule.go

Cuối cùng, sử dụng Git Push Lệnh để đẩy mô-đun của bạn vào kho lưu trữ GitHub:

  • git đẩy

Đầu ra sẽ trông giống với điều này:

Đầu ra.
Trên chi nhánh Main Không có cam kết nào Các tập tin không được kiểm duyệt: [Sử dụng "git thêm pubmodule .GO Main -> Main

. git đẩy , mô-đun của bạn sẽ được đẩy vào kho lưu trữ của bạn và sẽ có sẵn cho bất kỳ ai khác sử dụng. Nếu bạn không có bất kỳ phiên bản nào được xuất bản, hãy đi sẽ sử dụng mã trong nhánh mặc định của kho lưu trữ của bạn làm mã cho mô-đun của bạn. Không có vấn đề gì nếu nhánh mặc định của bạn được đặt tên main, master, or something else, only what your repositorys default branch is set to.

Trong phần này, bạn đã thực hiện mô-đun GO địa phương mà bạn đã tạo và xuất bản nó vào kho lưu trữ GitHub để làm cho nó có sẵn cho người khác sử dụng. Mặc dù bây giờ bạn có một mô-đun được xuất bản, một phần khác của việc duy trì mô-đun công cộng là đảm bảo người dùng mô-đun của bạn có thể sử dụng phiên bản ổn định của nó. Bạn có thể muốn thực hiện các thay đổi và thêm các tính năng vào mô-đun của mình trong tương lai, nhưng nếu bạn thực hiện các thay đổi đó mà không cần sử dụng các phiên bản trong mô-đun của mình, bạn có thể vô tình phá vỡ mã của ai đó sử dụng mô-đun của mình. Để giải quyết vấn đề này, bạn có thể thêm các phiên bản vào mô-đun của mình khi bạn đạt được một cột mốc mới trong phát triển. Tuy nhiên, khi thêm các phiên bản mới, hãy chắc chắn chọn số phiên bản có ý nghĩa để người dùng của bạn biết liệu họ có an toàn để nâng cấp ngay lập tức hay không.

Phiên bản ngữ nghĩa

Một số phiên bản có ý nghĩa cung cấp cho người dùng của bạn một ý tưởng về giao diện công cộng hoặc API, họ sẽ tương tác với đã thay đổi. Đi truyền đạt những thay đổi này thông qua một sơ đồ phiên bản được gọi là phiên bản ngữ nghĩa, hoặc "Semver" ngắn. [Phiên bản ngữ nghĩa sử dụng chuỗi phiên bản để truyền đạt nghĩa là về thay đổi mã, đó là nơi phiên bản ngữ nghĩa nhận được tên của nó.] Hệ thống mô-đun của Go theo Semver để xác định phiên bản nào mới hơn phiên bản bạn đang sử dụng, cũng như liệu mới hơn hay không Phiên bản của một mô-đun là an toàn để nâng cấp để tự động.

Phiên bản ngữ nghĩa cung cấp cho từng số trong một chuỗi phiên bản một ý nghĩa. Một phiên bản điển hình trong Semver chứa ba số chính: phiên bản chính, phiên bản nhỏ và phiên bản vá. Mỗi số trong số này được kết hợp với . to form the version, such as 1.2.3. The numbers are ordered with the major version first, the minor version second, and the patch version last. This way, when looking at a version, you can see which one is newer because the number in a specific spot is higher than previous versions. For example, the version 2.2.3 is newer than 1.2.3 because the major version is higher. Likewise, the version 1.4.3 is newer than 1.2.10 because the minor version is higher. Even though 10 is higher than 3 in the patch version, the minor version 4 is higher than 2 so that version takes precedence. When a number in the version string increases, all the other parts of the version following it reset to 0. For example, increasing the minor version of 1.3.10 would result in 1.4.0 and increasing the major version of 2.4.1 would result in 3.0.0.

Sử dụng các quy tắc này cho phép xác định phiên bản nào của mô-đun để sử dụng khi bạn chạy Go Get . Ví dụ, giả sử bạn có một dự án sử dụng phiên bản 1.4.3 of the module, github.com/your_github_username/pubmodule. If you depend on pubmodule being stable, you may only want to automatically upgrade the patch version [the .3]. If you run the command go get -u=patch github.com/your_github_username/pubmodule, Go would see that you want to upgrade the patch version of the module and would only look for new versions with 1.4 as the major and minor part of the version.

Khi tạo ra một bản phát hành mới của mô-đun của bạn, điều quan trọng là phải xem xét cách API công khai của mô-đun của bạn đã thay đổi. Mỗi phần của chuỗi phiên bản ngữ nghĩa truyền tải phạm vi của API thay đổi đối với cả bạn và người dùng của bạn. Những loại thay đổi này thường rơi vào ba loại khác nhau, xếp hàng với từng thành phần của phiên bản. Những thay đổi nhỏ nhất làm tăng phiên bản vá, các thay đổi cỡ trung bình sẽ tăng phiên bản nhỏ và các thay đổi lớn nhất sẽ tăng phiên bản chính. Sử dụng các danh mục này để xác định số phiên bản nào để tăng sẽ giúp bạn tránh phá vỡ mã của riêng mình và mã của bất kỳ ai khác dựa vào mô-đun của bạn.

Số phiên bản chính

Số đầu tiên trong phiên bản Semver là số phiên bản chính [ 1 .4.3 ]. Số phiên bản chính là số quan trọng nhất cần xem xét khi phát hành phiên bản mới của mô-đun của bạn. Một thay đổi phiên bản lớn được sử dụng để báo hiệu các thay đổi không tương thích ngược với API công khai của bạn. Một thay đổi không tương thích ngược sẽ là bất kỳ thay đổi nào trong mô-đun của bạn sẽ khiến chương trình của ai đó bị hỏng nếu chúng được nâng cấp mà không thực hiện bất kỳ thay đổi nào khác. Phá vỡ có thể có nghĩa là bất cứ điều gì từ một sự cố để xây dựng vì một tên hàm đã thay đổi hoặc thay đổi cách thư viện hoạt động mà kết quả trong cùng một phương thức trả về "v1" instead of "1". This is only for your public API, though, meaning any exported types or methods someone else could use. If the version only includes improvements a user of your library would not notice, it doesnt need a major version change. A way to remember which changes fit into this category might be that anything considered an update or a delete would be a major version increase.

LƯU Ý: Không giống như các loại số khác trong Semver, phiên bản chính 0 có thêm ý nghĩa đặc biệt. Phiên bản chính 0 được coi là phiên bản "trong phát triển". Bất kỳ loại nào có phiên bản lớn 0 không được coi là ổn định và bất cứ điều gì có thể thay đổi trong API bất cứ lúc nào. Khi bạn tạo một mô-đun mới, tốt nhất là bắt đầu với phiên bản chính 0 và chỉ cập nhật các phiên bản nhỏ và vá cho đến khi bạn kết thúc phát triển ban đầu của mô-đun. Khi API công khai của mô-đun của bạn được thay đổi được thực hiện và được coi là ổn định cho người dùng của bạn, đã đến lúc bắt đầu với phiên bản 1.0.0 . Unlike the other types of numbers in SemVer, the major version 0 has an additional special significance. The major version 0 is considered the in development version. Any SemVer with a major version 0 is not considered stable and anything can change in the API at any time. When you create a new module its best to start with major version 0 and only update minor and patch versions until youve finished initial development of your module. Once your modules public API is done changing and considered stable for your users, its time to start with version 1.0.0.

Lấy đoạn mã sau như một ví dụ về những gì một phiên bản chính thay đổi có thể trông như thế nào. Bạn có một hàm được gọi là UserAddress that currently accepts a string as a parameter and returns a string:

chuỗi useraddress [chuỗi tên người dùng] chuỗi { // trả về địa chỉ người dùng như một chuỗi Không

Trong khi hàm hiện trả về chuỗi , bạn có thể xác định nó sẽ tốt hơn cho bạn và người dùng của bạn nếu hàm trả về struct Like * Địa chỉ . Bằng cách này, bạn có thể bao gồm dữ liệu bổ sung đã được tách ra, chẳng hạn như mã bưu chính: string, you may determine it would be better for you and your users if the function returned a struct like *Address. This way you can include additional data already split apart, such as a postal code:

Loại địa chỉ Cấu trúc { Chuỗi địa chỉ Chuỗi postalcode. Không Func userAddress [chuỗi tên người dùng] * Địa chỉ { // trả về địa chỉ người dùng và cấu trúc mã bưu chính Không

Đây sẽ là một ví dụ về thay đổi phiên bản lớn vì nó sẽ yêu cầu người dùng của bạn thực hiện thay đổi mã của chính họ để sử dụng nó. Điều tương tự cũng đúng nếu bạn quyết định xóa useraddress Hoàn toàn vì người dùng của bạn sẽ cần cập nhật mã của họ để sử dụng thay thế.

Một ví dụ khác về thay đổi phiên bản chính sẽ được thêm một tham số mới vào useraddress , ngay cả khi nó vẫn trả về chuỗi : UserAddress function, even if it still returns a string:

Func userAddress [chuỗi tên người dùng , Uppercase BOOL ] Chuỗi { // trả về địa chỉ người dùng như một chuỗi, chữ hoa nếu bool là đúng Không ....................

Vì sự thay đổi này cũng yêu cầu người dùng của bạn cập nhật mã của họ nếu họ đang sử dụng hàm useraddress , nó cũng sẽ yêu cầu một phiên bản chính tăng. .UserAddress function, it would also require a major version increase.

Không phải tất cả các thay đổi bạn thực hiện đối với mã của bạn sẽ quyết liệt như. Đôi khi bạn sẽ thực hiện các thay đổi đối với API công khai của mình, thêm các chức năng hoặc giá trị mới, nhưng điều đó không thay đổi bất kỳ loại nào hiện có.

Số phiên bản nhỏ

Số thứ hai trong phiên bản Semver là số phiên bản nhỏ [ 1. 4 .3 ]. Một thay đổi phiên bản nhỏ được sử dụng để báo hiệu các thay đổi tương thích ngược với API công khai của bạn. Một thay đổi tương thích ngược sẽ là bất kỳ thay đổi nào không ảnh hưởng đến mã hoặc dự án hiện đang sử dụng mô-đun của bạn. Tương tự như số phiên bản chính, điều này chỉ ảnh hưởng đến API công khai của bạn. Một cách để ghi nhớ những thay đổi nào phù hợp với thể loại này có thể là bất cứ điều gì được coi là "bổ sung", nhưng không phải là "cập nhật". 1.4.3]. A minor version change is used to signal backward-compatible changes to your public API. A backward-compatible change would be any change that doesnt affect code or projects currently using your module. Similar to the major version number, this only affects your public API. A way to remember which changes fit in this category might be anything considered an addition, but not an update.

Sử dụng ví dụ tương tự từ số phiên bản chính, hãy tưởng tượng bạn có một phương thức có tên useraddress trả về chuỗi : UserAddress that returns a string:

chuỗi useraddress [chuỗi tên người dùng] chuỗi { // trả về địa chỉ người dùng như một chuỗi Không

Trong khi hàm hiện trả về chuỗi , bạn có thể xác định nó sẽ tốt hơn cho bạn và người dùng của bạn nếu hàm trả về struct Like * Địa chỉ . Bằng cách này, bạn có thể bao gồm dữ liệu bổ sung đã được tách ra, chẳng hạn như mã bưu chính: UserAddress to return *Address, you decide to add a completely new method named UserAddressDetail:

Loại địa chỉ Cấu trúc { Chuỗi địa chỉ Chuỗi postalcode. Không chuỗi useraddress [chuỗi tên người dùng] chuỗi { // trả về địa chỉ người dùng như một chuỗi Không func useraddressdetail [chuỗi tên người dùng] * Địa chỉ { // trả về địa chỉ người dùng và mã bưu chính struct Đây sẽ là một ví dụ về thay đổi phiên bản lớn vì nó sẽ yêu cầu người dùng của bạn thực hiện thay đổi mã của chính họ để sử dụng nó. Điều tương tự cũng đúng nếu bạn quyết định xóa useraddress Hoàn toàn vì người dùng của bạn sẽ cần cập nhật mã của họ để sử dụng thay thế. Đây sẽ là một ví dụ về thay đổi phiên bản lớn vì nó sẽ yêu cầu người dùng của bạn thực hiện thay đổi mã của chính họ để sử dụng nó. Điều tương tự cũng đúng nếu bạn quyết định xóa useraddress Hoàn toàn vì người dùng của bạn sẽ cần cập nhật mã của họ để sử dụng thay thế. Đây sẽ là một ví dụ về thay đổi phiên bản lớn vì nó sẽ yêu cầu người dùng của bạn thực hiện thay đổi mã của chính họ để sử dụng nó. Điều tương tự cũng đúng nếu bạn quyết định xóa useraddress Hoàn toàn vì người dùng của bạn sẽ cần cập nhật mã của họ để sử dụng thay thế. }

Thêm lần này useraddressdetail không yêu cầu thay đổi của người dùng nếu họ cập nhật lên phiên bản mô-đun này, vì vậy nó sẽ là được coi là một số phiên bản nhỏ tăng. Họ có thể tiếp tục sử dụng useraddress và chỉ cần cập nhật mã của họ nếu chúng muốn bao gồm thông tin bổ sung từ Useraddressdetail . UserAddressDetail function doesnt require changes by your users if they update to this version of your module, so it would be considered a minor version number increase. They can continue using UserAddress and would only need to update their code if theyd rather include the additional information from UserAddressDetail.

Thay đổi API công khai có thể không phải là lần duy nhất bạn sẽ phát hành phiên bản mới của mô-đun của mình. Bugs là một phần không thể tránh khỏi của sự phát triển phần mềm và số phiên bản vá là có để che đậy các lỗ đó.

Số phiên bản vá

Số phiên bản vá là số cuối cùng trong phiên bản Semver [ 1.4. 3 ]. Thay đổi phiên bản vá là bất kỳ thay đổi nào doesnt affect the modules public API. Changes that dont affect a modules public API tend to be things like bug fixes or security fixes. Using the UserAddress function from the previous examples again, suppose a release of your module is missing part of an address in the string the function returns. If you release a new version of your module to fix that bug, it would only increase the patch version. The release wouldnt include any changes to how a user uses the UserAddress public API, only the correctness of the data returned.

Như bạn đã thấy trong phần này, cẩn thận chọn một số phiên bản mới là một cách quan trọng để kiếm được sự tin tưởng của người dùng của bạn. Sử dụng phiên bản ngữ nghĩa hiển thị cho người dùng số lượng công việc cần thiết để cập nhật lên phiên bản mới và bạn sẽ không vô tình làm họ ngạc nhiên với một bản cập nhật phá vỡ chương trình của họ. Sau khi xem xét các thay đổi bạn đã thực hiện đối với mô-đun của mình và xác định số phiên bản tiếp theo để sử dụng, bạn có thể xuất bản phiên bản mới và cung cấp cho người dùng của mình.

Xuất bản phiên bản mô-đun mới

Trước khi bạn xuất bản phiên bản mới của mô-đun của mình, bạn sẽ cần cập nhật mô-đun của mình với những thay đổi mà bạn dự định sẽ thực hiện. Không có bất kỳ thay đổi nào, bạn sẽ không thể xác định phần nào của phiên bản ngữ nghĩa để tăng. Đối với mô-đun trong hướng dẫn này, bạn sẽ thêm Goodbye method to complement the Hello method, and then youll publish that new version for users to use.

Trước tiên, hãy mở pubmodule .Go Tệp và thêm Goodbye Phương thức cho API công khai của bạn: pubmodule.go file and add the new Goodbye method to your public API:

pubmodule/pubmodule.go

gói pubmodule chuỗi hello [] chuỗi { Trả lại "Xin chào, bạn!" Không func Goodbye [] chuỗi { Trả lại "tạm biệt bây giờ!" }

Khi bạn đã lưu thay đổi của mình, bạn sẽ muốn kiểm tra những thay đổi nào dự kiến ​​sẽ được thực hiện bằng cách chạy Git Status : < / a >.git status:

  • trạng thái git.

Đầu ra sẽ trông tương tự như vậy, cho thấy sự thay đổi duy nhất trong mô-đun của bạn là phương thức bạn đã thêm vào pubmodule . A> : pubmodule.go:

Đầu ra.
Trên chi nhánh Main Chi nhánh của bạn được cập nhật với 'Xuất xứ / Main '. Thay đổi không được dàn dựng cho cam kết: [Sử dụng "git thêm PubModule .GO Không có thay đổi nào được thêm vào cam kết [sử dụng "git add" và / hoặc "git commit -a"] .....................

Tiếp theo, thêm thay đổi vào các tệp đã diễn ra và cam kết thay đổi đối với kho lưu trữ cục bộ của bạn với git thêm và git cam kết : git add and git commit:

  • git thêm.
  • git cam kết -m "Thêm phương thức tạm biệt"

Đầu ra sẽ trông giống với điều này:

Đầu ra.
Trên chi nhánh Main Chi nhánh của bạn được cập nhật với 'Xuất xứ / Main

Thay đổi không được dàn dựng cho cam kết:master or main]. Between releases, the default branch would accumulate these types of changes until its time to publish a new release.

Vì mô-đun của bạn ở đây không trải qua quá trình này, hãy nhấn các thay đổi bạn đã thực hiện đối với kho lưu trữ sẽ mô phỏng sự tích lũy thay đổi thay đổi:

  • git đẩy

Đầu ra sẽ trông giống với điều này:

Đầu ra.
ĐỐI TƯỢNG SỐ: 5, XONG. Đếm các đối tượng: 100% [5/5], thực hiện. Nén Delta sử dụng tối đa 8 luồng Các đối tượng nén: 100% [3/3], được thực hiện. Đối tượng viết: 100% [3/3], 369 byte | 369,00 Kib / s, được thực hiện. Tổng cộng 3 [Delta 0], Tái sử dụng 0 [Delta 0], Gói tái sử dụng 0 Đến github.com: your_github_username / pubmodule Sau khi các thay đổi được cam kết, bạn sẽ cần phải đẩy chúng vào kho lưu trữ GitHub của bạn. Trong một dự án phần mềm lớn hơn, hoặc khi làm việc với các nhà phát triển khác trong một dự án, bước này thường sẽ hơi khác nhau. Khi thực hiện phát triển về một tính năng mới, một nhà phát triển sẽ tạo một nhánh git để đưa các thay đổi cho đến khi tính năng mới ổn định và sẵn sàng để được phát hành. Một khi điều đó xảy ra, một nhà phát triển khác sẽ xem xét các thay đổi trong nhánh để thêm một cặp mắt thứ hai có thể đánh bắt các vấn đề mà nhà phát triển đầu tiên có thể đã bỏ lỡ. Khi đánh giá kết thúc, chi nhánh sau đó sẽ được hợp nhất vào nhánh mặc định [chẳng hạn như Sau khi các thay đổi được cam kết, bạn sẽ cần phải đẩy chúng vào kho lưu trữ GitHub của bạn. Trong một dự án phần mềm lớn hơn, hoặc khi làm việc với các nhà phát triển khác trong một dự án, bước này thường sẽ hơi khác nhau. Khi thực hiện phát triển về một tính năng mới, một nhà phát triển sẽ tạo một nhánh git để đưa các thay đổi cho đến khi tính năng mới ổn định và sẵn sàng để được phát hành. Một khi điều đó xảy ra, một nhà phát triển khác sẽ xem xét các thay đổi trong nhánh để thêm một cặp mắt thứ hai có thể đánh bắt các vấn đề mà nhà phát triển đầu tiên có thể đã bỏ lỡ. Khi đánh giá kết thúc, chi nhánh sau đó sẽ được hợp nhất vào nhánh mặc định [chẳng hạn như Sau khi các thay đổi được cam kết, bạn sẽ cần phải đẩy chúng vào kho lưu trữ GitHub của bạn. Trong một dự án phần mềm lớn hơn, hoặc khi làm việc với các nhà phát triển khác trong một dự án, bước này thường sẽ hơi khác nhau. Khi thực hiện phát triển về một tính năng mới, một nhà phát triển sẽ tạo một nhánh git để đưa các thay đổi cho đến khi tính năng mới ổn định và sẵn sàng để được phát hành. Một khi điều đó xảy ra, một nhà phát triển khác sẽ xem xét các thay đổi trong nhánh để thêm một cặp mắt thứ hai có thể đánh bắt các vấn đề mà nhà phát triển đầu tiên có thể đã bỏ lỡ. Khi đánh giá kết thúc, chi nhánh sau đó sẽ được hợp nhất vào nhánh mặc định [chẳng hạn như Sau khi các thay đổi được cam kết, bạn sẽ cần phải đẩy chúng vào kho lưu trữ GitHub của bạn. Trong một dự án phần mềm lớn hơn, hoặc khi làm việc với các nhà phát triển khác trong một dự án, bước này thường sẽ hơi khác nhau. Khi thực hiện phát triển về một tính năng mới, một nhà phát triển sẽ tạo một nhánh git để đưa các thay đổi cho đến khi tính năng mới ổn định và sẵn sàng để được phát hành. Một khi điều đó xảy ra, một nhà phát triển khác sẽ xem xét các thay đổi trong nhánh để thêm một cặp mắt thứ hai có thể đánh bắt các vấn đề mà nhà phát triển đầu tiên có thể đã bỏ lỡ. Khi đánh giá kết thúc, chi nhánh sau đó sẽ được hợp nhất vào nhánh mặc định [chẳng hạn như .Git PubModule .GO 3235010 main -> main

Đầu ra hiển thị mã mới đã sẵn sàng để người dùng sử dụng trong nhánh mặc định.

Tính đến thời điểm này, mọi thứ bạn đã thực hiện giống như ban đầu xuất bản mô-đun của bạn. Tuy nhiên, bây giờ là một phần quan trọng của việc phát hành một phiên bản mới xuất hiện: Chọn số phiên bản mới.

Nếu bạn xem các thay đổi bạn đã thực hiện đối với mô-đun, thay đổi duy nhất đối với API công khai [hoặc thực sự bất kỳ thay đổi nào] đang thêm tạm biệt < AI = 2> Phương thức vào mô-đun của bạn. Vì người dùng có thể cập nhật từ phiên bản trước, chỉ có Xin chào , mà không thực hiện các thay đổi về phía họ, thay đổi này sẽ tương thích ngược thay đổi. Trong phiên bản ngữ nghĩa, một thay đổi tương thích ngược với API công cộng có nghĩa là sự gia tăng số phiên bản nhỏ. Đây là phiên bản đầu tiên của mô-đun của bạn được xuất bản, vì vậy không có phiên bản trước nào để tăng. Nếu bạn xem xét 0,0.0 sẽ "không có phiên bản", sau đó tăng phiên bản nhỏ sẽ dẫn bạn đến phiên bản 0,1 .0 , phiên bản tiếp theo của mô-đun của bạn. Goodbye method to your module. Since a user could update from the previous version, which only had the Hello function, without making changes on their part, this change would be a backward-compatible change. In semantic versioning, a backward-compatible change to the public API would mean an increase in the minor version number. This is the first version of your module being published, though, so theres no previous version to increase. If you consider 0.0.0 to be no version then incrementing the minor version would lead you to version 0.1.0, the next version of your module.

Bây giờ bạn có số phiên bản để cung cấp cho việc phát hành mô-đun của mình, bạn có thể sử dụng nó, được ghép nối với các thẻ git, để xuất bản một phiên bản mới. Khi các nhà phát triển sử dụng Git để theo dõi mã nguồn của họ, ngay cả bằng các ngôn ngữ khác ngoài GO, một quy ước chung là sử dụng các thẻ của git để theo dõi mã nào được phát hành cho một phiên bản cụ thể. Bằng cách này, nếu họ cần thay đổi phiên bản cũ, họ có thể sử dụng thẻ. Kể từ khi GO đã tải xuống các mô-đun từ kho nguồn, nó sẽ tận dụng thực hành này bằng cách sử dụng các thẻ phiên bản tương tự đó.

Để xuất bản phiên bản mới của mô-đun của riêng bạn bằng các thẻ này, bạn sẽ gắn thẻ mã bạn đang phát hành với git tag . Là một đối số cho Git Tag , bạn cũng cần cung cấp thẻ phiên bản. Để tạo thẻ phiên bản, hãy bắt đầu với tiền tố v , cho phiên bản và thêm Semver của bạn ngay sau đó. Trong trường hợp mô-đun của bạn, thẻ verison cuối cùng của bạn sẽ là v0.1.0 . Bây giờ, chạy Git Tag Để gắn thẻ mô-đun của bạn với thẻ phiên bản: git tag command. As an argument to the git tag command, youll also need to provide the version tag. To create the version tag, start with the prefix v, for version, and add your SemVer immediately after it. In the case of your module, your final verison tag would be v0.1.0. Now, run git tag to tag your module with the version tag:

  • Git Tag v0.1.0.

Khi thẻ phiên bản được thêm vào cục bộ, bạn vẫn sẽ cần nhấn thẻ vào kho lưu trữ GitHub của mình, điều mà bạn có thể thực hiện bằng cách sử dụng git đẩy Với Xuất xứ : git push with origin:

  • git đẩy nguồn gốc v0.1.0

Sau Git Push Lệnh Thành công, bạn sẽ thấy rằng một thẻ mới, V0. 1.0 , đã được tạo: git push command succeeds, youll see that a new tag, v0.1.0, has been created:

Đầu ra.
ĐỐI TƯỢNG SỐ: 5, XONG. Đếm các đối tượng: 100% [5/5], thực hiện. Nén Delta sử dụng tối đa 8 luồng Các đối tượng nén: 100% [3/3], được thực hiện. your_github_username / pubmodule Sau khi các thay đổi được cam kết, bạn sẽ cần phải đẩy chúng vào kho lưu trữ GitHub của bạn. Trong một dự án phần mềm lớn hơn, hoặc khi làm việc với các nhà phát triển khác trong một dự án, bước này thường sẽ hơi khác nhau. Khi thực hiện phát triển về một tính năng mới, một nhà phát triển sẽ tạo một nhánh git để đưa các thay đổi cho đến khi tính năng mới ổn định và sẵn sàng để được phát hành. Một khi điều đó xảy ra, một nhà phát triển khác sẽ xem xét các thay đổi trong nhánh để thêm một cặp mắt thứ hai có thể đánh bắt các vấn đề mà nhà phát triển đầu tiên có thể đã bỏ lỡ. Khi đánh giá kết thúc, chi nhánh sau đó sẽ được hợp nhất vào nhánh mặc định [chẳng hạn như Sau khi các thay đổi được cam kết, bạn sẽ cần phải đẩy chúng vào kho lưu trữ GitHub của bạn. Trong một dự án phần mềm lớn hơn, hoặc khi làm việc với các nhà phát triển khác trong một dự án, bước này thường sẽ hơi khác nhau. Khi thực hiện phát triển về một tính năng mới, một nhà phát triển sẽ tạo một nhánh git để đưa các thay đổi cho đến khi tính năng mới ổn định và sẵn sàng để được phát hành. Một khi điều đó xảy ra, một nhà phát triển khác sẽ xem xét các thay đổi trong nhánh để thêm một cặp mắt thứ hai có thể đánh bắt các vấn đề mà nhà phát triển đầu tiên có thể đã bỏ lỡ. Khi đánh giá kết thúc, chi nhánh sau đó sẽ được hợp nhất vào nhánh mặc định [chẳng hạn như Sau khi các thay đổi được cam kết, bạn sẽ cần phải đẩy chúng vào kho lưu trữ GitHub của bạn. Trong một dự án phần mềm lớn hơn, hoặc khi làm việc với các nhà phát triển khác trong một dự án, bước này thường sẽ hơi khác nhau. Khi thực hiện phát triển về một tính năng mới, một nhà phát triển sẽ tạo một nhánh git để đưa các thay đổi cho đến khi tính năng mới ổn định và sẵn sàng để được phát hành. Một khi điều đó xảy ra, một nhà phát triển khác sẽ xem xét các thay đổi trong nhánh để thêm một cặp mắt thứ hai có thể đánh bắt các vấn đề mà nhà phát triển đầu tiên có thể đã bỏ lỡ. Khi đánh giá kết thúc, chi nhánh sau đó sẽ được hợp nhất vào nhánh mặc định [chẳng hạn như Sau khi các thay đổi được cam kết, bạn sẽ cần phải đẩy chúng vào kho lưu trữ GitHub của bạn. Trong một dự án phần mềm lớn hơn, hoặc khi làm việc với các nhà phát triển khác trong một dự án, bước này thường sẽ hơi khác nhau. Khi thực hiện phát triển về một tính năng mới, một nhà phát triển sẽ tạo một nhánh git để đưa các thay đổi cho đến khi tính năng mới ổn định và sẵn sàng để được phát hành. Một khi điều đó xảy ra, một nhà phát triển khác sẽ xem xét các thay đổi trong nhánh để thêm một cặp mắt thứ hai có thể đánh bắt các vấn đề mà nhà phát triển đầu tiên có thể đã bỏ lỡ. Khi đánh giá kết thúc, chi nhánh sau đó sẽ được hợp nhất vào nhánh mặc định [chẳng hạn như .Git * [Thẻ mới] v0.1.0 -> v0.1.0

Đối tượng viết: 100% [3/3], 369 byte | 369,00 Kib / s, được thực hiện.v0.1.0 tag available for users of your module to reference.

Tổng cộng 3 [Delta 0], Tái sử dụng 0 [Delta 0], Gói tái sử dụng 0git tag, whenever a user runs go get to get the latest version of your module, it will no longer download a version based on the latest commit hash from the default branch. Once a module has a released version, the go tool will start using those versions to determine the best way to update the module. Paired with semantic versioning, this allows you to iterate and improve your modules while also providing your users with a consistent and stable experience.

Phần kết luận

Trong hướng dẫn này, bạn đã tạo một mô-đun GO công khai và xuất bản nó thành một kho lưu trữ GitHub để người khác có thể sử dụng nó. Bạn cũng đã sử dụng phiên bản ngữ nghĩa để xác định số phiên bản tốt nhất cho mô-đun của bạn. Cuối cùng, bạn đã mở rộng chức năng của mô-đun và, sử dụng phiên bản ngữ nghĩa, đã xuất bản phiên bản mới với sự tự tin rằng bạn sẽ không phá vỡ các chương trình phụ thuộc vào nó.

Đầu ra hiển thị mã mới đã sẵn sàng để người dùng sử dụng trong nhánh mặc định.

Để biết thêm thông tin về các mô-đun GO, dự án GO có một loạt các bài đăng trên blog chi tiết cách các công cụ GO tương tác và hiểu các mô-đun.Dự án GO cũng có tài liệu tham khảo rất chi tiết và kỹ thuật cho các mô-đun GO trong tham chiếu mô-đun GO.

Hướng dẫn này cũng là một phần của DigitalOcean cách mã trong loạt GO.Sê-ri bao gồm một số chủ đề GO, từ cài đặt lần đầu tiên để thực hiện cách sử dụng ngôn ngữ.

Video liên quan

Chủ Đề