Skip to main content

Web API 設計原則筆記

· 4 min read

「所有架構都來自於設計,但並非所有設計都能成為架構,架構來自於一系列重要的設計決策,這些決策塑造了一個系統的形式及功能」

「軟體開發者總是花費大量的時間在學習,學習那些他們未知的東西,這其他工作截然不同,因為我們的每一次總是我們的第一次(儘管在外人看來都是在敲鍵盤)。」

API 設計要素

  • 商業能力
  • 產品思維
  • 開發體驗 (DX)

API 設計 = 溝通與交流

Resource-Base API 迷思

  • 資源不等於資料模型(database table)
  • 資源不等於物件或領域模型 (不等於程式的物件)

API 設計原則

  • 設計 API 不要孤軍奮戰,要成就霸業需要眾志成城
  • API 設計應該是目標導向的,聚焦於目標並確保對他人是有價值的
  • 根據需求決定 API 設計,完美的 API 風格是不存在的,應該根據需求決定 API 風格,不碖是 REST, gRPC, GraphQL
  • API 最重要的 UI 就是文件,他應該擺在第一順位
  • API 是永存的,設計時需仔細規劃,而後加以迭代改進,才能讓 API 保持穩定與彈性

API Design First

首先需要確認目標、弄清楚 API 目標及目的為何,而不是盲目開始寫程式

  • 探索
  • 設計
  • 製作原型 (Prototype API or Mock API)
  • 交付
  • 上線

敏捷宣言

  • 最優先是滿足客戶需求
  • 歡迎改變需求、甚至到開發後期也是
  • 經常交付可用的軟體
  • 業務人員和開發者必須天天一起工作
  • 可用的軟體是最主要的進度量測方法
  • 持續追求優越的技術與優良的設計,以強化敏捷性
  • 精簡:或最大化未完成工作量之技藝

API 設計流程 :ADDR

  • Align 對齊
  • Define 定義
  • Design 設計
  • Refine 優化

商業能力:企業組織為維持市場競爭力與獲利所具備的能力模型,如產品設計、產品製造、客戶服務都是商業能力的一環

數位能力:企業組織提供自動化機制的能力模型

JTBD: jobs to be done, 在建構產品與服務時,明確知道必須完成的事項。圍繞在用戶有哪些問題、解決問題需要完成的哪些事項、解決問題之上的整體目標等等的課題

Job Story: When , I want to , so I can

事件風暴:好處可以為我們事件建立「模型」

REST API

  • 一系列的架構性約束與約定
    • 主從式架構、以資源為中心、以訊息為基礎、支援分層式系統、支援 Code on Demand、Hypermedia 特性 (可以在 API 狹帶其他相關資訊 例如下一頁等等/ HATEOAS)
  • REST 從來不只是 CRUD
    • JSON 和 CRUD 只是 REST 其中常用的設計要素
  • 適用於粗粒度的訊息交換

RPC 與 Query-Based API

RPC

  • 特徵主客端高度綁定、高度耦合,如果改動則客戶端也要改
  • 序列化格式是死的
  • 瀏覽器需要增加其他機制才能互動
  • 一般來說適用於全端自主開發的團隊,如果是主客端分開開發則需要保持兩端的 RPC 介面一致

Query-Based API (一隻 API 打天下)

  • OData 和 GraphQL
  • OData 以 REST 為基礎,允許以類似 SQL 的方式進行資料查詢操作
  • GraphQL
    • 只用到 GET 和 POST,具體查詢使用其查詢語言撰寫並且也能自定義自己要回覆的格式

異步 API

  • 輪詢
  • Webhook
  • SSE: EventSource
  • Websocket
  • grpc 串流
  • 中介代理:例如 RabbitMQ , AcativeMQ
  • pub-sub 模式

微服務

各自部署的小元件、一個微服務只負責少量的數位能力,每個微服務綜合起來就是一個就是個複雜的系統。 ⇒ 分散式系統的挑戰

不要低估導入微服務帶給組織文化上的衝擊,從原本的以產品或專案為單位的治理模式轉移到以微服務為單位的治理模式的衝擊是巨大的,過往的權資劃分與跨團隊的協調模式都要重頭來過,這是在導入微服務前必須要考慮到的,一且輕忽,那所謂的複雜度不僅不會降低,還會從虛擬的程式碼蔓延到實證的組織文化上。

你真的需要微服務嗎?

PyCon 2024 心得

· 2 min read

這個週末不耍廢,參加 PyCon 增加知識 Level Up Up ! 這次 PyCon 難得搬到南部來辦,感覺真的是一個很棒的機遇!

於是,我便速速在早鳥階段買票

  • 拿到了衣服
  • 玩了一些大地遊戲
  • 聽了一些議程
  • 吃了一些便當和點心XD

第一天

第一天我參加的幾乎都是 Tutorial , 我其實蠻喜歡 PyCon 這個 Part 的,學習怎麼去看 CPython 原始碼、以及 LLM的相關知識實作,真的複習我在工作上練習的那些東西...

研究 CPython 的議程也有點激勵我想讀 PHP 原始碼呢!

記錄一些自己第一天的筆記和連結:

PyNight

老實說這個活動真的讓我為這個 Conf 有特殊的印象...不過作為I人的我, 沒什麼和其他人交流實在有點可惜...也沒吃到什麼東西 QAQ

第二天

第二天老實講我有點耍廢躺平...哈,沒有太認真的聽議程...沒有加入 Tutorial, 窩在會議廳做自己的事情...用講員的聲音當作背景音哈

結論

我覺得 PyCon 英文感覺特別的多、特別的國際化呢!所以也給我一些提醒就是要真的學好英文,期待下次我聽英文議程時,可以有更高的理解度...不過,我也覺得和我幾年前參加 其他的Conf, 我真的有發現就算不是自己的吃飯工具(我主力不是 Python XD), 我聽懂與理解度都越來越高拉...謝謝 ChatGPT、謝謝過去努力的自己,當然也有可能,我剛好選的是簡單的議程?!

by the way , 我也覺得現場女生越來越多...看來寫 Python 的女生也越來越多了?! 會寫 Python 的女生很帥!

success

我覺得 Pycon 真的是一個適合 E人參加的 conf, 我這個 I 人做到團體任務就覺得蠻尷尬的XDD

讀巨人的筆記

· 2 min read

日前逛誠品書店,在推薦書架上看到了這本「巨人的筆記」...看了看裡面的內容,於是就給他買下去了。作者是一位「紀錄學」教授,老實講我是蠻意外居然有這種學問就是了...

購書連結

或許是翻譯問題吧?總覺得書裡內容總是會讓我有點搞混筆記與紀錄的意思,但是他給我一個蠻有趣的想法:「不要總是想當一個成功的人,而是要當一個 『成長的人』

一開始談到我們為什麼要學習做紀錄、做筆記,我覺得蠻認同的,就是『自由』和『成長』,但我覺得這本書把自由有點擴大的解釋,他把自由解釋為『自己做主』,或許可能和我們所理解的那些自由有一點不太一樣吧...不過沒差啦,不是很影響自己的閱讀。

而這本書也提供了一些有關於筆記的想法與概念,這讓我決定把原本筆記知識的網站做徹底的整理,作者在書裡提到紀錄不應該紀錄那些:

  • 為了不想記得那些東西而紀錄的紀錄
  • 一個不會重複回頭再看的紀錄
  • 不經思考的筆記

蠻重要的,畫線...這樣才能真正把紀錄、筆記深深的烙印在自己的內心裡,說真的,底層邏輯就說過,「累積是很重要的」,一次又一次的不斷去試驗,讓自己累積在累積,這複利效果可是很強大的呀!

還有在讀這本書的過程中,讓我想到以前我們國中的歷史老師:筆記不要每個都想要記、記很多、既使忽略了一些細節也無仿,重要的還是『專注』,我覺得這個小技巧也是可以拿出來放在這最後心得感想裡面...

success

做個成長的人~

持續買進

· 3 min read

過年其實也沒做什麼,就是把 Docker 練習一下、趁著 Udemy 特價又敗了三堂課程,一個 Laravel、一個 道德駭客相關、一個 GTM 相關(詳情可以看我上一篇文章...老子學不動了05)

不過,也是有稍微提升一下自己的 「FQ」,綜觀去年一整年,我看有相關的書籍應該就是持續買進了吧

這本書作者算是一個資料科學家吧?感覺他每個內容都引經據典、很多數據引入...來去佐證、加強自己的論證,也讓我學習到蠻多相關的知識...至少有點改變我目前的投資方案:一個月固定買一張 00888

為什麼是 00888 呢?因為那是我目前一個月比較能負荷的價格,其實也沒有多想,反正我就沒有什麼想要選擇特定個股的想法、從一開始胡亂投資之後大概也汰強去弱之後就手中抱著 三支ETF 和一個銀行個股....=> 組成月月配組合

企圖用時間換取(財務自由)空間,看能不能在自己退休後,讓被動收入超過三萬元... 但我也算過了,這幾乎有點不可能,除非中間跑去當「房東」(誤 只是靠著錢滾錢那小小的利息慢慢賺、穩穩賺,很難發大財啊

回到我看的這本書,他也給我蠻多概念,例如退休其實不是只有考慮錢錢的問題、以及如果想買大額奢侈品可以採取兩倍原則(👈 這個超級受用的啦)

現代社會也一變再變,作者也指出我們很難保持固定不變的財務狀況。於是關於儲蓄...他的建議是:能存多少就多少

很實用的一本書 ❤️

以下就直接將他最後一章的原則記下來啦

  • 窮人的重點應該放在存錢,富人的重點應該放在投資
  • 把你能存的錢存下來 (收入和支出很少是固定的,所以儲蓄率也不應固定不變)
  • 重點是收入,而非支出
  • 使用「兩倍原則」來消除花錢的罪惡感
  • 把你未來加薪及分紅的至少 50% 存起來
  • 舉債未必是好事或是壞事,端視妳如何使用它
  • 只有在時機對時才買房
  • 為大額購買而存錢時,採用現金存款方式
  • 退休要考慮的,不只是錢
  • 投資以積累財務資本,取代你與日逐漸衰弱的人力資本
  • 向業主般地思考,購買生財資產
  • 別買個股
  • 買進要快、賣出則慢
  • 儘早投資,且盡量經常投資
  • 投資並不是只看你有什麼牌,也取決於你如何打你手上的牌(整個投資生涯,你將經歷好運與壞運期,但最重要的是你的長期行為)
  • 當波動無可避免到來時,別害怕
  • 市場崩盤通常是買進的機會
  • 先把錢用於你需要的生活,在考慮為了你想要的生活而冒險投資
  • 你永遠都不會覺得自己有錢,這沒關係
  • 時間是你最重要的資產
  • 我們已經在玩的理財賽局
success

我算了一下,感覺今年有機會資產突破一百萬...為自己加油 🎉

個人推薦的電子報

· 3 min read

之前寫道開啟了新系列:老子我學不動了,裡面其實就想要分享自己在訂閱的幾個電子報,但因為一直懶惰所以一直沒有開工這一篇文章,不過後來在聊天在看書一直有講到所謂的「先求有再求好」、「先有 version 1 之後再慢慢迭代、要允許自己有試錯的空間」,我覺得他 ** 並不只有試用在企業,更適用於個人 **。

我想我之所以遲遲未開工這篇文章,其實不外乎就是個人的「完美主義」影響,其實我的部落格真的也沒有什麼,不要把自己想這麼偉大...

所以,真的可以開始直接開工、直接進入主題:

順道一提,早期我是使用 feedly 訂閱各網站的文章,但老實講需要我主動去 feedly 去看文章、到後面他使用體驗也越來越差,所以就慢慢的,轉而使用各大網站有提供電子報的功能,這樣的好處是我可以不用在到 feedly 網站看文章,同時也可以~~為我空空的電子信箱增加一點內容~~

Inside 硬塞的網路趨勢觀察

這個算是很老牌的新媒體,有時候我會看到一些有趣的文章,然後都蠻有收穫的。我想很多開發者應該都會有訂閱這個媒體,而且最近他還會整理 AI 趨勢,可以看到最近 AI 的最新發展這樣。

Star Rocket 科技創業週報

https://blog.starrocket.io/

這個電子報極推! 👍 👍 👍 我大概訂閱了一年多還是兩年多了,每次都有不同的收穫,很喜歡他們整理中英文的文章,套句中國用語我覺得是慢慢的乾貨。裡面無論是有關技術的、還是設計、創業相關的,都相當相當的不錯,我很喜歡這種不同角度看事情的感覺 ^^

技術管理觀點

https://techmgmt.substack.com/about

老實講最近他也沒什麼在更新了、沒有收到什麼新文章... 不過可以從技術管理的角度看待事情我真的覺得獲益良多... 以及他甚至有分享到如何建立技術團隊、如何擔當一個技術主管... 我覺得無論你未來有沒有機會可以當主管,都值得看一波...

科技島趨勢電子報

https://www.technice.com.tw/

老實講這個排版和 UIUX、整理沒有像前面兩個這麼好看,但內容是很不錯的,講到一些科技業的趨勢與狀況、對創業者也很有幫助,不過讓我臭一下,他們的 AI 主播真的有夠假... 可見他們 training 的應該還不夠哈哈

WordPress 開發週報

https://oberonlai.blog/

作為 WordPress 工程師,推薦這個人的電子報,之前他也有分享接案相關經驗,真的很不錯呢 👍

帶您讀源碼電子報

https://daininduyuanma.substack.com/

有時候會提出一些 special 的 package... 蠻好玩的!

Laravel News

作為 Laravel 愛好者,這是一定要給他訂閱的~

https://laravel-news.com/

ExplainThis

最近看到一個網站討論關於AI的電子報,裡面真的蠻多乾貨的,推薦ing

https://explainai.beehiiv.com/

success

你們也有自己喜歡的電子報嗎?歡迎交流~

WordCamp 2023 一日遊

· 5 min read

很久沒有更新這裡了,來分享與整理上個禮拜 WordCamp 一日遊的心得感想。之所以參加 WordCamp...是因為工作有在與 WordPress 打交道啊所以才去啊,不然我才不想去呢、台北對我來說是個傷心地

好拉,其實是有點怕遇到我的前同事...沒想到也真的不小心遇到他了...但沒想到最後也是「相談甚歡」...看來我的顧慮是太多了這樣。

以下就是大概快速帶過我參加了哪些議程以及 Catch 到什麼東東吧

啟程

好久沒有搭客運上台北了...深夜三點到早上八九點到台北的客運真是硬(不過我也無法保證自己是否能搭上最早班的高鐵...所以只能這樣了),所幸我自己的睡眠品質不是太要求,畢竟自己自己是貨車司機之子,在卡車上睡覺的經歷比比皆是...相較於比較舒服的客運,可以啦 💪

一下巴士,便衝去我自己最懷念、私藏的台北兩家早餐之一 😍

終於到達議程會場啦~ ❤️

ChatGPT 不會教你的 WordPress 外掛開發術

作為開發者,當然是會想要參加這個議程啊 ~

其實我知道在 PHP 界裡面有個知名的套件管理器是 Composer, 但太多的 WP 外掛很多都還是停留在 Native PHP 的等級...頂多引入 OO 的技術,我其實也正在學習如何將 Composer 引入我目前的 plugin 開發流程中...這樣的目的就是開發才會變得更快、維護性與品質都能到達一個新的 level。

以下提供幾個關鍵字:

以及講者也在議程中分享他程式架構的設計與分類,超級蠻實用的,另外我前同事也是 mur mur 自己沒有早點聽到這塊分享,因為講者也有分享很多人家提供做好的套件可以快速開發 WordPress...(我前同事說他都自幹)

另外,我自己私底下也有和講者交流,學到了很多東西,像是:

我想這後面都是我應該做的功課以及慢慢將其引入的過程、實驗等等。

WordPress 的安全性之令人堪憂的可能是你,網站管理員!

其實不外乎就是外掛與主題要定期更新,其中我學到比較大的部分就是可以試著去鎖來自機房的 IP

天哪!這個 work_with_wordpress repo 有點香...

翹課去逛攤位

其實中間有一場我就沒有特別去聽了...直接想說逛逛外面的攤位,我發現 Web3 真的開始有興起的趨勢,光是外面攤位就擺了兩個:

有感於 Web 3.0 的興起,也是在思考是否這是個可以跟上的趨勢嗎?我絕對肯定區塊鏈、去中心化絕對是個好的概念,但一旦用在金錢遊戲上,這是否淪為一種炒作與賭博的遊戲呢?這是我對於 Web3.0 的疑慮,同時我也希望自己能夠以非金錢遊戲角度切入 Web 3.0 , 我想這是我未來的目標之一。

WooCommerce 資料結構解析:實務問題與解決策略

蠻驚訝於訂單越多,網站就會越慢的這個事實...,

最後講者也提供針對這點說可以使用資料庫的冷熱分離(但聽他的分享感覺有點麻煩 哈,感覺需要一點時間消化理解!)、另外替換一些比較慢的外掛、自己研發等等...

由於 WordCamp 不是定調為技術議程,講者也不過就是分享他們自己的經歷,我其實還蠻喜歡這種實務分享,當然!我自己也趁這個機會一股腦的將自己在工作上遇到的優化問題與各位講者討論與交流... 他們很多都說「快取」的重要性... 或許這也是未來我該研究的方向,如何制定好的快取策略...

Super HTML? 不使用 PHP 也能輕鬆達成客製化

其實講者就是在分享業配一下這個外掛而已:

我覺得如果是和前端相關的部分,或許可以考慮使用以上那個外掛...

雖然對於開發者而言可能直接玩的會是佈景主題就是了XD

和前同事的相談甚歡

前同事和我推薦到他們做 Log 收集有用到:

過去他們公司 CICD 也用到

不過現在他們也在用 Buddy 了

我想這也是我之後可以試著去引入或實驗的部分 哈哈

結論

我覺得 WordCamp 和我以前參加的技術議程都不太一樣,因為他所參與的會眾顯然與我過去參加的組成有很大不一樣,有創業者、設計師、WordPrress 愛好者...工程師就不再會是大部分的組成...因此議程上面就幾乎沒有太高的技術濃度。

後記

隔天找學弟聊天,覺得他們之前工作都會到九點十點真的覺得好辛苦好誇張喔,我真是幸運選擇了一個好的工作(雖然無法發大財)。

然後聊了雜七雜八的...之後還是跑去天瓏書店...原本是打算不買書的...但不小心還是買了...(書店真是個可怕的地方哈哈)

success

希望我學弟能保持身體健康啦!啊當然我自己也是 XD

和Travis說掰掰

· 2 min read

github action 是一個 github 提供的 CICD 服務。但是我的專案(resume)已經是很久以前寫的,甚至那時還使用 gulp3 撰寫(之後我調整升級成 gulp4 的寫法)

而當時我選用travis ci作為自動化部屬的服務之一。現在我想說既然在 Github 上不如就把他換成github action 的服務吧!沒想到意外的簡單!讓大家比較一下

  • travis
language: node.js
node.js: 14.5
install:
- npm install
- npm install --global gulp-[email protected]
- npm install -g [email protected]
- bower install
script:
- gulp
deploy:
skip_cleanup: true
email: [email protected]
name: r567tw
provider: pages
github_token: "$GITHUB_TOKEN"
local_dir: "public"
on:
branch: master
  • github action
name: Node.js CI

on:
push:
branches:
- master # Set a branch to deploy

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: '14.5'
- run: npm install
- run: npm install --global gulp-[email protected]
- run: npm install -g [email protected]
- run: bower install
- run: gulp
- name: Push
uses: s0/git-publish-subdir-action@develop
env:
REPO: self
BRANCH: gh-pages # The branch name where you want to push the assets
FOLDER: public # The directory where your assets are generated
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GitHub will automatically add this - you don't need to bother getting a token
MESSAGE: "Build: ({sha}) {msg}" # The commit message
Footer

其實我就只是格式換一換,而比較特別的是使用s0/git-publish-subdir-action@develop 這個外部 action 這樣。

success

我覺得 gihub action 好好玩~

MQTT筆記

· 3 min read

一種在應用層的比HTTP還輕量之通訊協議,常常被物聯網所使用。至於他的核心在於有一個名詞名為Broker,負責讓大家subscribepublish

作為 Client 端一旦與這個Broker連結之後,他可以sub也可以pub

使用 Dockerfile 起 MQTT Broker

其實網路上有很多教學再告訴你怎麼架設一個 MQTT Broker, 目前市面上分佈最廣的的是開源專案:Mosquitto, 不過我這裡為了方便示例與教學,就使用Dockerfile來快速啟動,而他也是Mosquitto 提供的image。

$ docker run -it -p 1883:1883 -p 9001:9001 -v mosquitto.conf:/mosquitto/config/mosquitto.conf -v /mosquitto/data -v /mosquitto/log eclipse-mosquitto

Let's Try MQTT, 以 Python 為例

我們這邊就需要有人去訂閱以及發布它,建立兩個python檔案分別做subscribepublish 建立subscribe.py

# encoding: utf-8
import paho.mqtt.client as mqtt

# 當地端程式連線伺服器得到回應時,要做的動作
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))

def on_message(client, userdata, msg):
print(msg.topic+" " + str(msg.payload))


client = mqtt.Client()

client.on_connect = on_connect
client.on_message = on_message


client.connect("localhost", 1883)

client.subscribe('ack')
client.loop_forever()

建立publish.py

import paho.mqtt.client as mqtt

# 建立 MQTT Client 物件
client = mqtt.Client()

# 設定登入帳號密碼(若無則可省略)
# client.username_pw_set("myuser","mypassword")

# 連線至 MQTT 伺服器(伺服器位址,連接埠)
client.connect("localhost", 1883)

client.publish("ack","Hello World")

然後讓我們先在終端機上面執行subscribe.py : python subscribe.py 之後再開一個新終端機或者另一個tab執行publish.py: python publish.py 之後你會在subscribe.py那個畫面看到publish的訊息喔

publish不只是可以傳送文字、也可以傳送bytearray,當sub端接收到這些bytearray時就可以實現建立檔案,這樣 MQTT 也可以傳送檔案了。

關於 MQTT & Security

至於 MQTT 肯定是要考慮一些安全的部分。老實講我在MQTT是個初心者。。。

但有上網找到這一篇文章,值得大家參考 [物聯網協定與資安的距離] MQTT 通訊協定淺談

success

第一次碰 MQTT 耶

Auth 筆記

· 3 min read

這個我以前面試有被考過這一題,印象非常的深刻!所以在這裡便紀錄下來做一個重新再提醒。HTTP其實是一種Stateless的協定,也就是無狀態的協定。這意味著:每一次的HTTP Call都可以被視為一種獨立事件、彼此互不關聯。

然而,我們平時怎麼處理用戶的認證、如何登入登出的呢?

認證

接續前面說HTTPStateless,事實上,瀏覽器是一種軟體與應用程式,在HTTP當中有header可以增加一些簡易的資訊,而瀏覽器會存一些資訊在裡面,像是cookiesession storage等等。

面試時常常有一題要你比較一下cookielocalstorage,sessionstorage: 這裡我簡述一下下

  • cookie: 存在瀏覽器的一種方式,空間比較小,會被使用者容易竄改
  • localstorage: 存在瀏覽器的一種方式,空間比較大,不容易因為瀏覽器關閉而消失
  • sessionstorage: 也是存在瀏覽器的一種方式,何謂session?就是瀏覽器關閉之後它就消失了......但同樣空間比cookie大多

基礎登入登出

基礎的登入登出奠基於cookie上,假設你沒有帶這個cookie就沒辦法辨認你是誰。而cookie是使用者端在控制的,很容易可以偽造,而他也不適合放機密資料,於是放在server端的session就產生了,但接著前面說的stateless,事實上瀏覽器那邊也會存一個session_id在那裡,於是瀏覽器在呼叫時便能拿這個session_id來和session做對應取得用戶資料、狀態

而session如果碰上load balancer, 就會需要考慮是否要另外存放在redis之類的等等複雜issue。

JWT

是一種 token 機制的 auth 系統。主要分成有三個部分:header, payload 和 Signature。你可以透過網路上將token做驗證。 可以看看這部分的參考資訊

OAuth

一種授權與帳號分開的auth系統,通常與第三方有關係(例如Google登入、Facebook登入),他會挑出一個畫面問你要用什麼平台登入、並且授權平台可以提供給你的資料(例如email,姓名等等)。關於Oauth 可以看參考資料,我還不算是這部分的專家:參考資料

另外還有一篇文章也直得紀錄:https://blog.kenwsc.com/posts/2023/jwt-vs-session/

success

auth 真的博大精深

建立一個Pypl package

· 4 min read

這是一篇隨便寫一寫的文章,主要是紀錄我想要建立一個簡單的 pypl package 紀錄。 建立一個自己的 pypl package 其實還蠻簡單的,需要先事先準備的是:

  • 一個 pypl 帳號或一個 testpypl 帳號:在這裡我使用 testpypl, 這個網站就是 pypl 官方來測試 pypl package 的網站用的,所以測試的話你可以盡量使用。如果你要正式使用可以使用 pypl 帳號喔。
  • twine pypl package
  • build pypl package

當然是建立自己的 package 拉,在這裡我簡單建立一個名為r567tw_pypl的 pypl package 為例。

注意:這裡的名稱建議最好不要使用“-",我在這裡吃了蠻多苦...(參考:https://stackoverflow.com/questions/761519/is-it-ok-to-use-dashes-in-python-files-when-trying-to-import-them)

資料夾結構會像這樣:

├── pyproject.toml
├── src
│   └── r567tw_pypl
│   ├── __init__.py
│   └── greet.py
  • __init__.py 裡面保持空白就好,如果你有曾經處理 local package 的相關議題,應該可以知道這個檔案在做什麼
  • pyproject.toml:最重要的檔案,等等會說明
  • greet.py 裡面就是你要寫的程式碼拉,或者你要另外寫 py 也可以,我這裡以 greet 為例

有些教學會教你建立LINCENSEREADME.md,但因為我們這裡只是測試用我也沒有要很認真將這個當成 package 經營,我這裡就直接忽略掉了,但不影響我們後面建立 package

greet.py裡面就這樣寫

def hello(name = None):
print(f"Hello {name}")

至於最重要的檔案:pyproject.toml 以我此次要建立的 package 為例,就這樣寫

[project]
name = "r567tw_pypl"
version = "0.0.1"
authors = [
{ name="r567tw", email="[email protected]" },
]
description = "example package for practice"
readme = "README.md"
requires-python = ">=3.7"

[project.urls]
"Homepage" = "https://github.com/r567tw/r567tw-pypl-package"
"Bug Tracker" = "https://github.com/r567tw/r567tw-pypl-package/issues"

裡面其實也有很多規範與格式可以參考,可以自行上網看看其他人或官方怎麼寫。

第二步:建立上傳的 package

接下來我們就來使用build這個 package 來建立我們要準備上傳給 pypl 的部分...

python -m build

接下來你就會看到很多檔案被建立:{package_name}.egg-info、dist 資料夾。其中最重要的正是這個 dist 資料夾

最後使用twine這個 package 來上傳吧,如果你要上傳正式 pypl,把中間 repository 拿掉即可

twine upload --repository testpypi dist/*

接下來他會問你帳號&密碼,把你剛剛註冊的資料輸入進去就好囉。

最後,來測試一下吧

先建立很純淨的環境

virtualenv other

然後pip list

Package    Version
---------- -------
pip 22.2.2
setuptools 65.4.1
wheel 0.37.1

很確定很乾淨、沒有我們裝的套件。 然後到twine最後丟給你的網址,以這裡為例是:https://test.pypi.org/project/r567tw-pypl/ 就按照他中間的指令安裝:

pip install -i https://test.pypi.org/simple/ r567tw-pypl

這時候pip list就會很清楚看到套件已經安裝。

Package     Version
----------- -------
pip 22.2.2
r567tw-pypl 0.0.1
setuptools 65.4.1
wheel 0.37.1

最後,讓我們實際來玩玩看吧:

from r567tw_pypl import greet


greet.hello("World!")

執行後, Good, 看到我們要的結果拉!

回顧

此教學極為簡易,只是把目標純粹 focus 在建立個簡單的 pypl package. 像是 test 啊、還有pyproject.toml裡面的設定都可以再說個一篇兩篇之類的,像是我對於build-system那裡就還不太懂...或許之後找時間可以再更多專研研究。

參考來源

https://packaging.python.org/en/latest/tutorials/packaging-projects/

整個實作程式碼可以參考這裡:https://github.com/r567tw/r567tw-pypl-package

小君曰:Hello Pypl