
前言:
各位好, 我是 LINE Taiwan 資深開發技術推廣工程師 – Evan Lin。 LINE Bot Go SDK 是一個經營超過了五年的專案,並且版本號碼也早就已經超過了 v7 。
而本月月初 (2021/April) LINE Bot Go SDK 迎來有版本的更新,這次有支援到三月平台所提供新的功能,還有將去年公開的 Flex Message 的 update 2 更新了。歡迎大家使用。
同時我們也在這一個版本開始支援 Go Modules 。 結果一開啓就踩到雷,感謝開源社群的協助修復,本篇將整理相關心得,跟大家分享一下。
這篇文章的投影片,我也有在 Golang Meetup #56 分享。大家也可以看投影片。
文章索引
本篇文將要介紹以下一些的部分:
如何將舊的開源專案支援 Go Modules

LINE-BOT-SDK-GO 是 LINE 開源出來的對於 LINE Messaging API 所釋放出的開源套件,並且支援多個語言版本(Go., PHP, Java, Python) 。
原本這個 https://github.com/line/line-bot-sdk-go 的版本已經超過 v7 ,但是遲遲沒有支援 go modules 。 也就是並沒有 go.mod
在該專案的檔案下面。所以需要透過以下方式來啟動 Go Modules (Enable Go Modules)
- go mod init
- go mod tidy
- go mod vendor
原本 PR 看起來也沒有太多的問題,於是就將新版本發佈出來。 (v7.9.0)
發生問題了
原本版本更新後,看起來也沒有太多問題。但是版本更新後卻發生了以下兩個問題:
無法更新版本 (Cannot update version by “go get”)
這時候我試著去更新一個本來有使用到 https://github.com/line/line-bot-sdk-go 的套件,正常的更新流程如下:
>> go mod tidy
go: finding module for package github.com/line/line-bot-sdk-go/linebot
go: found github.com/line/line-bot-sdk-go/linebot in github.com/line/line-bot-sdk-go v7.8.0+incompatible
問題出來了,我明明有更新版本到 v7.9.0
但是卻無法抓到最新的版本?
於是我拿了一個新的專案,重頭試試看。
- Copy https://github.com/line/line-bot-sdk-go/tree/master/examples/echo_bot to your go path
go mod init
go mod tidy
結果一樣是出現:
>> go mod init
go: creating new go.mod: module github.com/kkdai/echo_bot
go: to add module requirements and sums:
go mod tidy
>> go mod tidy
go: finding module for package github.com/line/line-bot-sdk-go/linebot
go: found github.com/line/line-bot-sdk-go/linebot in github.com/line/line-bot-sdk-go v7.8.0+incompatible
大家可以參考這個 issue 。 不論使用 go get
還是使用 go mod tidy
都無法順利將版號更新的最新的版本。 這個問題,讓我困擾了一陣子。
pkg.go.dev 上面版本是舊的
先來稍微解釋一下 https://pkg.go.dev 是一個 Golang 社群的套件說明網站。開發者可以透過關鍵字搜尋套件,並且可以查看相關的說明(所有內容都是根據 github.com 上面的資訊)。
而透過 https://pkg.go.dev 也可以很輕鬆的查許多專案版本方面的資訊,比如說 https://pkg.go.dev/github.com/appleboy/gofight 可以看到有最新版本 v2
- https://pkg.go.dev/github.com/appleboy/gofight/v2
雖然 https://github.com/line/line-bot-sdk-go 已經加上了 go.mod
的檔案,但是卻無法找到 https://pkg.go.dev/github.com/line/line-bot-sdk-go/v7 這個資料夾。
這時候感謝台灣網友提供的 Pull Request 提供給我相關的想法。
Go Modules 對於 v2 之後的支援方式
根據官方的文件 - Golang-Blog Publishing v2 and beyond 上面有提到,如果需要發布 v2 之後的版本由於是具有不向後兼容的方式。 所以在發布得時候,官方建議有兩個方式:
- 建立一個新的資料夾
v2
並且把東西全部更新到該資料夾上面。並且更改go.mod
將版本號碼改成v2
。 - 或是直接更改目前資料夾的
go.mod
將版本號碼改成v2
。
修改 go.mod 檔案到 v2 (或是之後)的方式
$ go mod edit -module github.com/YOU/YOUR_PROJECT/v2 go.mod
這邊要注意,因爲 go mod init
並不會自動幫你加上相關的版本(如果超過 v2),只得自行加上。所以需要「手動」加上相關的版號,也就是說如果你的套件可能已經超過了 v2
以上,但是一直沒有啟動過 go modules 那麼你可能就會踩到這個雷。
如何修復? 有用到的人該如何修改?
原始套件啟動 Go Modules 的修復方式
關於 https://github.com/line/line-bot-sdk-go 的修復方式,大家可以參考這個 pull request 。
使用到的套件,要如何能夠正確的更新版本?
如果你是使用 https://github.com/line/line-bot-sdk-go 這個套件的人,請根據以下方式來正確地取得最新的版本。
- 所有 import 的地方,修成到
v7
- AS-IS:
import "github.com/line/line-bot-sdk-go/linebot"
- TO-BE:
import "github.com/line/line-bot-sdk-go/v7/linebot"
- AS-IS:
- 重新修改 `go.mod. 透過執行
go mod tidy
go mod vendor
- 測試你本地端的程式碼,確定沒問題。
- 更新到 GitHub
結論:
因為 Go Modules 其實是兩年前的 1.11 才開始使用,但是許多專案其實也沒有馬上啟動。 如果沒有啟動 Go Modules 其實版本更新也不會出錯。 但是只要一啟動 Go Modules 的話,就要小心本篇文章所提供的相關案例。
其實啟動 Go Modules 是相當方便的,也應該要提早準備好相關的修正。希望每一個套件管理者能儘早的準備升級到 Go Modules 的套件支援。
相關文章:
- Go Modules: v2 and Beyond
- Module release and versioning workflow
- Go Module 如何發佈 v2 以上版本
- line-bot-sdk-go #273 upgrade major version to v7 for meets the specification of go module
- line-bot-sdk-go #274 Bug Report - Could not update to latest version v7.9.0
- Golang-Blog Publishing v2 and beyond
- Go Doc: Publishing breaking API changes
想要轉職? 快來參加 LINE Developers Recruitment Day

LINE 也即將在 5/22 的招募日與大家見面,現場會有許多工程團隊的同仁來為大家介紹,歡迎大家來報名頁面報名參加本次盛會!
【學生票申請方法】
請先翻拍或掃描學生證
寄送至 dl_dev_meetup@linecorp.com
資格符合後即可獲得邀請碼
【轉職邀請票申請方法】
寄送履歷至 dl_dev_meetup@linecorp.com
資格符合後即可獲得邀請碼
活動小結
立即加入「LINE 開發者官方社群」官方帳號,就能收到第一手 Meetup 活動,或與開發者計畫有關的最新消息的推播通知。▼
「LINE 開發者官方社群」官方帳號 ID:@line_tw_dev
關於「LINE 開發社群計畫」
LINE 於 2019 年開始在台灣啟動「LINE 開發社群計畫」,將長期投入人力與資源在台灣舉辦對內對外、線上線下的開發者社群聚會、徵才日、開發者大會等,已經舉辦 30 場以上的活動。歡迎讀者們能夠持續回來察看最新的狀況。詳情請看: