[TIL][Jekyll] 移除 Disqu 替換到 utteranc 來使用 github issue 作為文章評論

前言:

疫情升溫打斷本來出遊計劃,還好女兒很乖在玩。 那我就來弄弄 Jekyll 的評論搬遷,結果發現最近有個好用系統 utteranc.es 可以讓你直接使用 github issue 來作為文章評論。 來看看吧。

本篇文章將告訴你如何移出,並且使用 Github Comment 作為文章評論用,現在也有個開源好用的工具。 https://utteranc.es/

什麼是 Disqus

一直以來本站是透過 Jekyll 來架設的,之前本來有使用 Disqus 作為文章評論系統,雖然很多人說廣告太多,太慢。只是覺得還好,可能沒仔細看。 最近覺得 disqus 的廣告越來越嚴重,影響整個效能。決定拿掉了。 有需要參考的可以看一下這個 commit 主要就是先註解掉相關的設定。 然後發送 git push 即可。

移除 diqus

大家可以參考這個 commit. https://github.com/kkdai/kkdai.github.io/commit/3dfba4885874cb1cb0c06a09fd2f4fffd892623a

主要就是把 disqus 的設定拔掉。

highlighter: rouge
markdown: kramdown
#disqus: evanlin1007

#comments :
#    provider : disqus
#    disqus :
#      short_name : evanlin1007

加入 utteranc

utteranc 是一個完全 Open Source 並且使用 github comment 。並且提供一些設定,還有外觀的 theme 可以設定。感覺相當好用,社定上也很簡單:

  • Install for your github app
  • Put code in your Jekyll
  • Done ! (搭啦)

參考 https://github.com/kkdai/kkdai.github.io/commit/b9606abd93c08bf131efa4db78c8762e8a26f1da 可以修改 _layouts/post.html 如下:

<script src="https://utteranc.es/client.js"
        repo="kkdai/blog"
        issue-term="pathname"
        theme="github-light"
        crossorigin="anonymous"
        async>
</script>

完成品:

這樣是不是很快速(五分鐘就好了)

代辦事項:

接下來就要把 disqus 的評論搬到 github comment, 這邊可以先 export 出來後,寫個 Golang 來 import 。找到了在這裡: http://disqus.com/admin/discussions/export/

接下來就是把文章評論搬過去。

參考文章:

[學習心得][Golang] 如何透過 Golang 開發 OAuth2 的 PKCE - 以 LINE Login 為例

前言:

在 2021/04/09 的新聞上, LINE Login 支持了 PKCE (Proof Key for Code Exchange) 的流程。 本篇文章將清楚地解釋一下,什麼是 LINE Login ? 為何 LINE Login 需要支持 PKCE ? 最後會透過一個範例,帶領著讀者們一起來導入與體驗 LINE Login with PKCE 。

其中本篇文章的程式碼分為三個部分,以下快速說明:

TL;DR

本篇文將要介紹以下一些的部分:

什麼是 LINE Login? 什麼又是 OAuth 2.0 ?

許多的商業服務都會透過會員機制來提供許多專屬的優惠或是獎勵活動,但是會員的註冊與登入流程常常讓許多使用者覺得為難。除了要填寫許多的資料外,使用者還需要額外記住另外一組的帳號密碼。 LINE 在台灣的佔有率相當的高,並且幾乎每個使用者都有 LINE 的帳戶的狀況下,這時候如果能夠直接使用 LINE 帳戶來註冊與登入網站服務的話是不是相當的方便?

LINE Login 除了提供一個方式來登入之外,也可以提供使用者名稱,大頭照的相關資訊。並且透過 LINE Login 也可以同時讓使用者加入商業服務的 LINE官方帳號,讓使用者更無時無可都可以使用到相關的服務。

什麼樣的情況會建議使用 LINE Login

這裡會條列出哪些情況建議需使用 LINE Login 作為讀者來評量自己有沒有需要使用 LINE Login :

  • 剛開始要建立電子商務服務或是網站,想要減少使用者註冊的時間並且快速加入。
  • 想要推廣自身官方帳號的聊天機器人服務。
  • 就算是已經推廣一段時間的電子商務服務,但是想要透過 LINE 來接觸不同的客戶群。

了解為什麼使用 LINE Login 以及甚麼狀況下建議使用之後,接下來就引導讀者如何使用範例程式碼

範例程式碼

https://github.com/kkdai/line-login-go

如何部署範例程式碼:

  • LINE Developer Console 建立相關的 Provider 跟 Channel。
  • 建立一個 LINE Login 的帳號,並且將以下兩個資訊記住:
    • Channel ID
    • Channel Secret
  • 另外建立一個 LINE@ 並且打開 MessageAPI 的功能(也就是建置 chatbot 用),並且將以下兩個資訊記住:
    • Channel Secret
    • Channel Token
  • https://github.com/kkdai/line-login-go 按下 Heroku Deploy ,建立該帳號並且部署該服務。這時候會要輸入三個資訊:
    • LINECORP_PLATFORM_CHANNEL_CHANNELID
      • 填入 LINE login channel ID
    • LINECORP_PLATFORM_CHANNEL_CHANNELSECRET
      • 填入 LINE login channel Secret
    • LINECORP_PLATFORM_CHATBOT_CHANNELSECRET
      • 填入 Chatbot channel Secret
    • LINECORP_PLATFORM_CHATBOT_CHANNELTOKEN
      • 填入 Chatbot channel Token
    • LINECORP_PLATFORM_SERVERURL
      • 這個資訊根據你的 heroku app 名稱來決定,假設你的 Heroku app 名稱叫做 test-api-1234 那麼你就該填 https://test-api-1234.herokuapp.com
  • 回到 LINE Login 的帳號設定,[App setting] 將以下位置寫入 callback URL https://test-api-1234.herokuapp.com/auth
  • 回到 LINE chatbot 的帳號設定,記得把 https://test-api-1234.herokuapp.com/callback 加到 LINE chatbot web hook 才能正確地啟動聊天機器人。

LINE Login 的流程

(使用 Profile (也就是 OAuth 2.0) 方式來讓使用者透過 LINE Login 之後取得使用者資訊)

LINE Login 提供了兩種方式來讓開發者可以安全地取得使用者資訊:

兩種方式的不同點在於開發者可以再請求 scope 的時候標注是透過 openid 或是 profile 方式來索取相關資訊。

以下的內容均參照 Integrating LINE Login with your web app

  • (1). 首先瀏覽器訪問該網站 (假設你直接使用 https://login-tester-evan.herokuapp.com/),進入了 browse() 顯示出三個 LINE Login 按鈕。
  • (2). 使用者按下了 LINE Web Login 的話,就會進入 gotoauthpage() 直接產生一組 API URL 直接導向到 https://access.line.me/oauth2/v2.1/authorize 。這邊其實有一些參數可以設定,可以參考 LINE Login 參數設定
  • (3). 使用者這時候會連到 LINE Platform 來進行登入的步驟,不論是透過 App 登入還是輸入帳號密碼的登入方式。登入完成後會透過 redirect_uri 網址的位址傳回一組 code ,作為使用者資料的存取之用。 這時候會呼叫到 auth() 來解析 code 。
  • (4). 在同一個 auth() 之中解析 code, state, 與 friendship_status_changed 後,檢查 state 正確性之後。就可以透過 code 去抓取使用者的資料了。 這時候會呼叫 https://api.line.me/oauth2/v2.1/token 的 API ,相關必要參數也可以參考這個網址
  • (5). 一樣在 auth() 之中,回傳的結果可以得到 id_token ,透過 id_token 需要透過解譯的方式來將它還原成使用者的資料。這邊也已經包裝好為 DecodeIDToken()
  • 透過 DecodeIDToken() 就可以得到使用這名稱與大頭照。 (email 需要額外申請)

以上就是一般的電子商務網站的導入流程。

OAuth2 有什麼樣的缺點

在 OAuth2 提出後, Google 也在 2015 Google 提出的 RFC 7636中也提出了一些值得考量的點。 本篇文章有提到在手機端的 App 如果導入了 OAuth2 的流程中,有可能傳輸過程中被其他惡意安裝的手機 App 竊取相關資訊。 相關細節可以參考 LINE Login 官網提供的詳細案例

(詳細說明,請參考 Benefits of implementing PKCE for LINE Login)

這裡稍微跟大家說明相關的流程與發生的問題:

  • 使用者透過手機上有串接 OAuth2 的 App 來做 Authorization
  • 進入 OAuth2 服務提供商的帳號登入畫面
  • 認證完成後, OAuth2 平台會根據當初登記的 URL (手機上為某個登入的 URI Scheme) ,開啟相關 App。
  • 這時候,如果有使用者不小心安裝了惡意的 App ,他可以登記同一個 URI Scheme ,但是因為手機設計原理兩個 App 都會收到相關的 URI Callback 。
  • 惡意程式(Malicious App) 收到 URI Callback 呼叫並且取的 codestate 並且透過其他方式取得 Channel ID 跟 Channel Secret (原理透過 App 掃瞄,這裡就不詳細敘述)。
  • 這時候,取的 codestate 的惡意程式,就可以透過呼叫 GetAccessToken 取的相關 Token 並且獲得權限。

由於原先的 OAuth2 在 client App 端有這樣的缺陷,所以透過 PKCE 的方式可以來補救相關問題。

什麼是 PKCE?

(from LINE Login 導入 PKCE in LINE Login 的流程示意圖)

PKCE (Proof Key for Code Exchange) 是由 Google 在 RFC 7636 提出的 Code Exchange 機制,透過這樣的交換資訊方式。可以避免中間透過 Callback URI 所造成的竊取攻擊。 詳細的方式敘述如下:

先解釋兩個參數:

  • Code Verifier: 一個特殊字串,長度限制為 43 ~ 128 之間。
  • Code Chanllenge: 透過 SHA 256 將 Code Verifier 轉換過的字串。

接下來要解釋一下,這兩個字串如何能夠讓 OAuth2 的流程中安全性增加。由於 SHA256 是不可逆且較安全的加密模式,並且在資料的傳輸上先提供 Code Chanllenge 再來是 Code Verifier 可以確保著交握的兩端都是同一個人,因為必須要同時都有兩個才能正確地確認。 這樣就算原本的 code 被竊取到了,也會因為無法產生正確的 Code Verifier 讓惡意程式無法竊取到資料。

那麼詳細的 LINE LOGIN withg PKCE 流程如下:

  • 產生 Web Login URL 的時候,先丟 Code Chanllenge 在傳遞參數中。
  • 連接到 LINE 開始認證流程,完成認證流程後。透過 Callback URI 傳回 codestate
  • 這時候認證方會將 Code Verifier送給認證伺服器來取得 Access Token 。
  • 認證伺服器端會拿 Code VerifierCode Chanllenge 來確認,是否是同一個需求端發出的需求。
  • 返回 Access Token ,完成認證跟取得資訊的需求。

如何在 LINE Login 之中導入 PKCE?

接下來會使用 line-login-SDK-go 與 LINE-login-pkce-go 兩個範例程式碼來展示:

如何產生 Code Verifier

如何產生 Code Challenge

文件上面有提供 Code Challenge 的 python psuedo code ,這邊將其轉換成 Golang 的程式碼。 主要比較複雜的部分是 sha256.Sum256() 跟字串要做 URLEncoding 處理。 主要要根據 Base 64 Encoding with URL and Filename Safe Alphabet (opens new window) 的處理方式來做。 其實在 Golang 只要一行就可以搞定了。

產生 Web Login 網址

這一段程式碼則是利用 github.com/kkdai/line-login-sdk-go 所產生的網頁轉址的程式碼,主要就是產生 codeVerifiercodeChallenge (Global 參數)。請注意,在 SPEC 中,每一個 Web Login request 的 codeVerifiercodeChallenge 都需要是不同的,才能確保資訊的安全。

要求 Access Token 的程式碼修改

這裡只需要注意的是, codeVerifier 需要傳遞正確的,不需要重新產生即可。

展示

這邊有個簡單的展示網站,也歡迎想了解如何開發的開發者們,可以直接使用以下的開源程式碼。 範例程式碼提供兩種模式的來取得使用者的登入資料。

  • OpenID: 透過 OpenID 的格式,直接登入完成後,取得使用者登入資訊的 JWT 。並且提供相關解析的程式碼。
  • GetUserProfile: 透過取得 User Access Token 的方式,呼叫 Get User Profile 來取得登入使用者的資訊。

更多的程式碼,歡迎參考。

LINE Login PKCE Starter:

結論:

許多開發者在開發 Web App 的時候,最麻煩的往往是使用者資料的註冊。 因為複雜的註冊流程與多一個帳號密碼往往會讓使用者卻步。 LINE Login 提供良好的機制可以讓許多開發者使用到國內最多人使用的 LINE 來登入,節省掉許多開發上的麻煩。 本篇文章介紹了新的登入機制: PKCE for LINE Login 。 讓登入機制符合最新的安全機制外,更可以讓使用上沒有開發後顧之憂。 並且提供相關範例程式碼x,讓開發者可以無痛的導入最新的機制。

相關文章:

[TIL][Kotlin] 關於 Kotlin 相關語法快速整理

前言:

最近 Google Taiwan 開啟一個計畫「Android App 開發培訓計劃 2021」,透過 Android Studio 跟著 Kotlin 這個語言來讓大家寫 Android App 。趁機順便學習一下 Kotilin 相關語法跟需要注意的地方。

相關工具

Kotlin Playground

由於有點懶得安裝環境跟相關的 IDE 設定,所有的練習其實可以快速的在 Kotlin Playground 上面完成。

語法Tutorial - Koans

可以透過網頁上面的 Koans 或是內建在 JetBrains IntelliJ IDEA or Android Studio 的 JetBrains educational plugin

學習建議:

由於這個語言我不是很熟習,但是熟悉新的語法其實蠻建議透過 Tutorial 來先有個概念性的了解,方便你開始相關的查詢。 所以這邊建議先跑過一次 Koans 再來把相關資料結構與語法來做一個語法的相關脈絡整理。

特別資料結構語法說明

LIST

val numbers: List<Int> = listOf(1, 2, 3, 4, 5, 6)

透過 List 關鍵字來加上 generic type 來建立出相關 List 物件。也可以透過 Inferred 方式建立。

val numbers = listOf(1, 2, 3, 4, 5, 6)

Kotlin 是 Zero-based Index 的語言(延伸自 Java) 。

MutableList

參考官方文件 , MutableList 為長度可變的 List 。也就是可以針對 List 去 add, addAll, listIterator, remove, removeAll… 相關操作。 宣告方式參考如下:

val entrees = mutableListOf<String>()

相關文章:

[TIL][Android] Android Studio 開啟專案可能會遇到的問題

前言:

最近 Google Taiwan 開啟一個計畫「Android App 開發培訓計劃 2021」,透過 Android Studio 跟著 Kotlin 這個語言來讓大家寫 Android App 。雖然我之前有寫過,但是也很久沒使用 Android Studio 了,來開啟專案看看吧。 不過一開始好像開啟錯誤的 codelabs www 不小心開到後面的 Use Kotlin Coroutines in your Android App,出現了一些問題,也順便解決一下。

如何設定環境(How to setup your Android 4.1 on Mac Catalina)

跟著這次的 Kotlin coroutine codelab 你會找到 Android Studio 下載的地方。 你也會找到相關的 github for Kotlin coroutine 。 然後透過 Android Studio 來打開 coroutines-codelab 的資料夾,你可能會出現以下的 Error 。

> License for package Android SDK Build-Tools 29.0.2 not accepted
> License for package Android SDK Platform 29 not accepted.

> Could not resolve all dependencies for configuration ':start:debugRuntimeClasspath'.
> Could not create task ':start:minifyReleaseWithR8'.
> Cannot query the value of this provider because it has no value available.

原因:

因為最新版本的 Android Studio 4.1.3 ,預設使用的 Android SDK 版本是 30 ,但是這次的 codelab 是使用舊版本的 29 來準備的。所以需要下載舊版本的 SDK 並且同意相關的 License 授權。

解決方式:

[Preference] -> [System Setting] -> [Android SDK] -> Enable Android Platform 29

這樣下載 Android SDK 29 的時候,就會同時去同意 License 。 就可以正常的 Compile。 範例也可以正常執行在 Android Simulator 上才是。

相關文章:

[好書分享] 無限賽局(The Infinite Game)

無限賽局 - 翻轉思維框架,突破勝負盲點,贏得你想要的未來 THE INFINITE GAME

作者: 賽門.西奈克  
原文作者: Simon Sinek  
譯者: 黃庭敏  
出版社:天下雜誌出版 

買書推薦網址:

前言:

這一本是今年所讀完的第五本書。賽門,西奈克(Simon Sinek) 一直是我很喜歡的作者,我似乎也買了(讀了)他的不少創作,從『先問為什麼」,到這一本書。

這一本書本來認為是講解有限思維與無限思維的書籍,但是有不少關於公司經營策略的方向。 如果公司透過了有限思維來制定公司的願景,那麼公司的前景是堪憂的,相反過來許多的公司都透過「無限賽局」的思維來訂定的公司的目標企業形象。這樣一來不僅僅能夠帶來源源不絕的動力,對于公司的進步也是可以期待的。

對於代表公司在外頭常做企業形象演講的我,這樣的思維是相當的重要的。這本書也蠻推薦給常需要代表公司在外頭演講的相關職業。

最後獻上天下雜誌所製作的推薦影片,其實蠻讚的。

內容簡介與心得:

《先問,為什麼?》暢銷作家賽門‧西奈克最新顛覆力作

黃金圈引導你找到最初的為什麼
無限思維為你重新定義工作與人生的方向與策略

贏了對手讓人士氣大振,但是為什麼興奮兩天就消散?
終於站上市場第一,但是新競爭者不斷出現,什麼時候才是真正的勝利?
在競爭中,我們怕輸、怕落後,拼命的像滾輪上不停奔跑的老鼠,疲憊不堪。
這是我們唯一的選擇嗎?

市場沒有一定規則,思維框架決定了你的策略選擇。
不被當下成敗綁架,才能主動應變,每天都充滿動力!

我們被自己的思維框架困住了!
習慣用贏家輸家、成功失敗的角度來看事情,
是讓我們不斷感到挫折、無法持續努力的最大盲點!

商業環境不是球賽棋局,改變規則沒有預告、參賽者沒有名額限制,也沒有一定的終場時間。

人生也是如此。

章節條列

  • 作者序 我為何寫這本書
  • 前言 怎樣才算勝利?
  • 01 有限賽局和無限賽局
  • 02 崇高的信念
  • 03 如何找到信念
  • 04 讓信念傳下去
  • 05 企業責任2.0
  • 06 意志與資源
  • 07 信任的團隊
  • 08 小心道德褪色
  • 09 可敬的對手
  • 10 攸關存亡的應變
  • 11 領導的勇氣
  • 後記 名為人生的賽局

就如同影片說明的,作者對於目前的企業文化覺得有些怪怪的。自從作者讀了五十年後的 1986 年,卡爾斯寫了《有限賽局與無限賽局》(Finite and Infinite Games) 之後,他知道許多問題的癥結點在於許多的企業都使用者「有限賽局」的思維作為企業文化的表徵。

在這本書一開始先敘述「有限賽局」與「無限賽局」的不同,主要的思考論點也在於「有限賽局」的思考脈絡始於競爭,但是就算很順利的將公司的達到了市場的領頭羊,或是市場上第一佔有率的公司。接下來又該如何? 這樣的思維往往是相當危險的,代表公司的創辦人本身看到的並不是公司未來的發展。就如同本書提到的,公司發起的主要因素一定是為了賺錢,但是如果只是將賺錢來當作公司主要核心目標甚至是公司標語的時候,那麼公司的未來是岌岌可危的。

因為往往賺到了許多前後,公司可能接下來就是精簡支出,以求取更高的獲利。為了讓股東賺取更多的獲利,而不在意是否能夠找到公司的信念。

但是每間公司並不完全能夠遵守的無限賽局的想法,很多時候許多公司一開始都是由著無限賽局的夢想而出發。 但是隨著與競爭者的相互競爭下,許多公司會迷惘,進而失去了無限賽局的思路,讓自己公司陷入了有限賽局的迷惘內。

這種往往發生在許多團隊中的「道德褪色」,指的是因為團隊間的惡性競爭,造就了欺騙甚至是假報成果的狀況。 書上也指出就算是在紀律嚴明的軍中,也會因為當局者陷入有限賽局的思路,每次只想著如何贏過其他的競爭對手來取得更好的成績,而與許著軍中出現了所謂的道德褪色的狀況。

「無限賽局」的思維並不容易,往往許多時候也會造成痛苦的轉變過程。 作者先舉了反向的例子,也就是「發明數位相機專利的柯達」,最後竟然就是被數位相既的風潮導致公司破產。 因為當初第一位發明數位相機專利的人,其實是柯達裡面的員工。但是當時的柯達高層,還是汲汲營營與底片的收入,認為底片才是柯達收入的主要來源,數位相機不會變成風潮。所以刻意打壓,申請了專利也只是拿來收取專利授權金而不是自己開發數位相機。到了數位相機得專利過期後洶湧而來的數位相機風潮就讓柯達支撐不下去,緊守著底片的他們也跟不上新的浪潮,只能走向破產的收場。

接下來作者也舉了具有公司信念的例子,比如說全美國最大的藥局 CVS 連鎖藥局,在 2014 年決定了下架了菸類的商品。 因為他們真正在護著客戶的健康,也了解販賣著真正下架香菸才能讓他們的顧客真正的健康。但是這樣的轉變一開始受到華爾街投資客的不看好,認為下架香菸商品會讓 CVS 的「每股獲利大幅度減少」,更讓整個企業走向衰敗。

但是事實上,許多的顧客樂於見到這樣的企業轉變。紛紛轉向CVS 去購買其他健康的商品。並且許多在 CVS 藥局工作的人也能夠以此為榮。真正的實現他們的口號「幫助人們變得更健康」。 這樣的企業口號變得更加的真實,也讓許多競爭者望塵莫及。這樣才真正是所謂的「無限賽局」的思維。

參考文章

心得:

Simon Sinek 真的很會激勵人心,就算只是在書上的文字。我剛看完 CVS 藥局那個段落的時候,真的是相當的激動也相當的感動。 真正的企業形象的塑造,在於如何透過一個簡單而由上往下的行動來塑造整體的企業文化。不要讓許多企業經營的原因影響了許多原本立意良好的企業初衷。 身為公司的技術傳教士,經常思考著如何能夠協助公司打造更好的技術品牌的同時。 回過頭來也常常想到,許多的上位者其實都帶給我們許多好的影響。 記得在日本總部受訓的時候,總部的技術長總是百忙之間抽空來跟新建同仁們聚餐,並且會儘量跟每一個同仁講到話。也希望每一位同仁能夠真正地做到「Be Open」,讓同仁們能夠更加的相互溝通。 這些事情也都是我經常忽略,應該要把這些小故事更經常地放在我的表現之中,希望每一個夥伴能感受到。

如果你也是要打造公司形象的行銷夥伴,或是也是技術傳教士。這一本書真的會讓你充足滿滿的能量。

[學習心得][Golang] 舊的開源專案開啟 Go Modules 可能會遇到的問題 (e.g. go get 無法更新版本)

前言:

各位好, LINE Bot Go SDK 是一個經營超過了五年的專案,並且版本號碼也早就已經到了 v7.8.0 。

而本月月初 (2021/April) LINE Bot Go SDK 又有新的版本更新了,這次有支援到三月平台所提供新的功能,還有將去年公開的 FLEX Msg 的 update 2 更新了。歡迎大家使用。

這個套件已經更新到 v7 版本,才支援 Modules 。 結果一開啓就踩到雷,感謝台灣的網友 wys1203 送了 PR 修復。 我也整理一下相關心得,跟大家分享一下。

TL;DR

本篇文將要介紹以下一些的部分:

如何將舊的開源專案支援 Go Modules

LINE-BOT-SDK-GO 是 LINE 開源出來的對於 LINE Messanging 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 但是卻無法抓到最新的版本?

於是我拿了一個新的專案,重頭試試看。

  1. Copy https://github.com/line/line-bot-sdk-go/tree/master/examples/echo_bot to your go path
  2. go mod init
  3. 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  上面版本是舊的

<a id=”go-dev-out-of-date””></a>

先來稍微解釋一下 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 這個套件的人,請根據以下方式來正確地取得最新的版本。

  1. 所有 import 的地方,修成到 v7

    1. AS-IS: import "github.com/line/line-bot-sdk-go/linebot"
    2. TO-BE: import "github.com/line/line-bot-sdk-go/v7/linebot"
  2. 重新修改 `go.mod. 透過執行

    1. go mod tidy
    2. go mod vendor
  3. 測試你本地端的程式碼,確定沒問題。

  4. 更新到 GitHub

結論:

因為 Go Modules 其實是兩年前的 1.11 才開始使用,但是許多專案其實也沒有馬上啟動。 如果沒有啟動 Go Modules 其實版本更新也不會出錯。 但是只要一啟動 Go Modules 的話,就要小心本篇文章所提供的相關案例。

其實啟動 Go Modules 是相當方便的,也應該要提早準備好相關的修正。希望每一個套件管理者能儘早的準備升級到 Go Modules 的套件支援。

相關文章: