Wednesday, February 13, 2019

Dart 套件工具

Dart SDK 裡面包了一個稱為 pub 的套件管理工具程式,說明網頁的標題是 Pub Package and Asset Manager

一個含有 pubspec.yaml 設定檔的資料夾就是一個 Dart 的 package,裡面原則上有個 lib/ 資料夾,詳情可以參考: Create Library Packages

在 pubspec 裡面,主要是設定名稱、相依套件 (dependency)、轉換器 (transformer)。

相依套件可以設定名稱,也可以設定成由 git 取得: Pub Dependencies

如果要自建套件發佈站: https://github.com/dart-lang/pub-dartlang-dart

開發時期才需要的套件,比如單元測試用的套件,可以列在 dev_dependencies 中。這主要是針對作為函式庫的套件,這樣僅僅使用到函式庫的話,就不用連測試用的套件也得安裝。

設定相依性的時候,版本規則比較特殊的是 Caret Syntax。意思是依照 semantic versioning 取相容的版本,舉例來說: ^5.2.3 會等同於 >=5.2.3 <6.0.0。關於相依性解析時,版本編號的解釋,可以參考: Pub Versioning Philosophy

整個建置的部份在各個平台間的整合與一致化似乎還不是很完整,目前 pub 指令的說明,包含 Pub Package and Asset ManagerPub Commands 裡面是說 pub buildpub serve 是專門針對 web 開發的:

Two additional commands (pub build and pub serve) are specific to web development.

這兩個子命令的文件也是丟在 Dart for the Web 那邊,但是 pub build 裡面用到的 transformer 又是在 pub 本身的文件裡頭介紹的 XDDD 可能整理的還不是很好,未來可能還會有變化。

一些名詞解釋: Glossary of Pub Terms -

Lockfile

一個檔案名稱為 pubspec.lock 的檔案,裡面會記載所安裝的套件的版本,會透過 pub get, pub upgrade, pub downgrade 等套件管理指令進行更新修改。

Application package

整個套件是作為應用程式使用,使用到的 dependencies 版本通常會是透過 Lockfile 鎖定在特定的版本上,在 pubspec.yaml 裡的版本規則反而是會用很隨意的方式設定,所以會建議 Lockfile 簽入版本控制中。

Library package

套件是作為函式庫使用為主,相依的 dependencies 版本應該儘量指定寬一點。

Asset

基本上就是所有影響到最後要佈署的產出的所有東西,包含原始碼、樣式表、圖檔等等。大概可以粗略的這樣分類:

  • pub buildpub serve來說:

    • Source asset: 在儲存媒體上的檔案,會被 pub 讀進去的,也就是原始的檔案。
    • Generated asset: 丟給 client 或是寫出到儲存媒體的檔案,會被 pub 輸出,也就是最後的結果產出。
  • transformer 的角度來看:

    • Input asset: 輸入的內容,可能是剛從 source asset 讀入,或是前一級的 transformer 的輸出。
    • Output asset: 輸出的內容,可能會被作為 generated asset 輸出,或是作為下一級 transformer 的輸入。

如果要自己寫 Transformer:

實作 Transformer 時所使用的套件是: barback

基本上要實作 Transformer 就是提供 .apply() (或是 .apply() 如果是實作 AggregateTransformer 的話,參數的型別不太一樣) 方法,要轉換的輸入會由外部用 Transform 物件傳入,轉換後把輸出用 Asset 物件包裝出來加到 Transform 物件中。

專案的資料夾 layout 可以參考: Pub Package Layout Conventions

不要加入版控的資料夾或檔案,可以參考 What Not to Commit (除了 Dart 的檔案外,裡面還有提到一些 IDE 所產生的檔案):

  • .packages: 由 pub 管理的所相依套件檔案。
  • doc/api: 在 doc/ 下的 api/ 資料夾是 dartdoc 產生出來的。
  • pubspec.lock: 看著辦,建議是 application package 的話要簽入版控。

No comments: