跳到主要內容

如何使用包

Dart 生態系統使用來管理共享軟體,例如庫和工具。要獲取 Dart 包,您可以使用 pub 包管理器。您可以在 pub.dev 站點上找到公開可用的包,或者您可以從本地檔案系統或其他地方(例如 Git 倉庫)載入包。無論您的包來自何處,pub 都會管理版本依賴關係,幫助您獲取彼此相容且與您的 SDK 版本相容的包版本。

大多數Dart 友好的 IDE 都提供對 pub 的支援,包括建立、下載、更新和釋出包。或者,您可以在命令列上使用dart pub

最低限度,Dart 包是一個包含pubspec 檔案的目錄。pubspec 包含有關包的一些元資料。此外,包可以包含依賴項(在 pubspec 中列出)、Dart 庫、應用程式、資源、測試、影像和示例。

要使用包,請執行以下操作:

  • 建立 pubspec(一個名為 pubspec.yaml 的檔案,其中列出包依賴項幷包含其他元資料,例如版本號)。
  • 使用dart pub get 來檢索包的依賴項。
  • 如果您的 Dart 程式碼依賴於包中的庫,請匯入該庫。

建立 pubspec

#

pubspec 是應用程式頂級目錄中名為 pubspec.yaml 的檔案。最簡單的 pubspec 只列出包名:

yaml
name: my_app

以下是 pubspec 的一個示例,它聲明瞭對 pub.dev 站點上託管的兩個包 (intlpath) 的依賴:

yaml
name: my_app

dependencies:
  intl: ^0.20.2
  path: ^1.9.1

要更新 pubspec.yaml 檔案而無需手動編輯,可以執行 dart pub add 命令。以下示例添加了對 vector_math 的依賴。

dart pub add vector_math
Resolving dependencies... 
+ vector_math 2.1.3
Downloading vector_math 2.1.3...
Changed 1 dependency!

有關建立 pubspec 的詳細資訊,請參閱 pubspec 文件以及您要使用的包的文件。

獲取包

#

有了 pubspec 後,您可以從應用程式的頂層目錄執行dart pub get

cd <path-to-my_app>
dart pub get

此過程稱為獲取依賴項

dart pub get 命令確定您的應用程式依賴哪些包,並將它們放在一箇中央系統快取中。如果您的應用程式依賴於已釋出的包,pub 會從pub.dev 站點下載該包。對於 Git 依賴項,pub 會克隆 Git 倉庫。傳遞依賴項也包括在內。例如,如果 js 包依賴於 test 包,pub 會同時獲取 js 包和 test 包。

Pub 會建立一個 package_config.json 檔案(位於 .dart_tool/ 目錄下),它將您的應用程式依賴的每個包名對映到系統快取中對應的包。

從包匯入庫

#

要匯入包中找到的庫,請使用 package: 字首:

dart
import 'package:js/js.dart' as js;
import 'package:intl/intl.dart';

Dart 執行時會獲取 package: 後面的所有內容,並在應用程式的 package_config.json 檔案中查詢它。

您也可以使用這種樣式從自己的包中匯入庫。假設 transmogrify 包的佈局如下:

transmogrify/
  lib/
    transmogrify.dart
    parser.dart
  test/
    parser/
      parser_test.dart

parser_test.dart 檔案可以像這樣匯入 parser.dart

dart
import 'package:transmogrify/parser.dart';

升級依賴項

#

當您第一次為您的包獲取新依賴項時,pub 會下載與您的其他依賴項相容的最新版本。然後它會透過建立一個鎖定檔案來鎖定您的包始終使用該版本。這是一個名為 pubspec.lock 的檔案,由 pub 建立並存儲在您的 pubspec 旁邊。它列出了您的包使用的每個依賴項(直接和傳遞)的特定版本。

如果您的包是一個應用程式包,您應該將此檔案提交到原始碼管理中。這樣,所有開發您應用程式的人都會使用其所有依賴項的相同版本。提交鎖定檔案還可以確保您的部署應用程式使用相同版本的程式碼。

當您準備將依賴項升級到最新版本時,請使用dart pub upgrade 命令:

dart pub upgrade

dart pub upgrade 命令告訴 pub 重新生成鎖定檔案,使用您的包依賴項的最新可用版本。如果您只想升級一個依賴項,可以指定要升級的包:

dart pub upgrade transmogrify

該命令將 transmogrify 升級到最新版本,但保持其他所有內容不變。

由於 pubspec 中版本約束衝突,dart pub upgrade 命令不總是能將每個包升級到最新版本。要識別需要編輯 pubspec 的過時包,請使用dart pub outdated

獲取生產環境依賴項

#

在某些情況下,dart pub get 不會檢索 pubspec.lock 檔案中鎖定的確切包版本:

  • 如果 pubspec.lock 檔案上次更新後,pubspec.yaml 中新增或刪除了新的依賴項。
  • 如果鎖定的版本在包倉庫中不再存在。
  • 如果您更改了 Dart SDK 的版本,並且某些包不再與該新版本相容。

在這些情況下,dart pub get 將會:

  • 解鎖足夠多的鎖定依賴版本,以便能夠解決衝突。
  • 通知您任何相對於現有 pubspec.lock 的依賴項更改。

例如,在您的依賴項中新增 retry: ^3.0.0 之後:

dart pub get
Resolving dependencies... (1.0s)
Downloading packages... 
+ retry 3.1.2

此外,如果已釋出包版本的內容雜湊pubspec.lock 檔案中的雜湊不同,pub 會警告您並更新鎖定檔案以反映已釋出的版本。

例如,如果您手動更改 pubspec.lockretry 的雜湊:

dart pub get
Resolving dependencies... 
Downloading packages... 
~ retry 3.1.2 (was 3.1.2)
The existing content-hash from pubspec.lock doesn't match contents for:
 * retry-3.1.2 from "https://pub.dev"

This indicates one of:
 * The content has changed on the server since you created the pubspec.lock.
 * The pubspec.lock has been corrupted.

The content-hashes in pubspec.lock has been updated.

For more information see:
https://dart.lang.tw/go/content-hashes
Changed 1 dependency!

將專案部署到生產環境時,使用 dart pub get --enforce-lockfile 來檢索依賴項。

如果專案的依賴約束無法與 pubspec.lock 中精確的版本和內容雜湊匹配,則包檢索和命令將失敗。這有助於避免將未經測試的依賴項和依賴項版本部署到生產環境。

dart pub get --enforce-lockfile
Resolving dependencies... 
Downloading packages... 
~ retry 3.1.2 (was 3.1.2)
The existing content-hash from pubspec.lock doesn't match contents for:
 * retry-3.1.2 from "https://pub.dev"

This indicates one of:
 * The content has changed on the server since you created the pubspec.lock.
 * The pubspec.lock has been corrupted.

For more information see:
https://dart.lang.tw/go/content-hashes
Would change 1 dependency.
Unable to satisfy `pubspec.yaml` using `pubspec.lock`.

To update `pubspec.lock` run `dart pub get` without `--enforce-lockfile`.

更多資訊

#

以下頁面包含有關包和 pub 包管理器的更多資訊。

操作方法

#

參考

#

Pub 子命令

#

dart pub 工具提供以下子命令:

有關所有 dart pub 子命令的概覽,請參閱pub 工具文件

故障排除

#

Pub 故障排除提供了您在使用 pub 時可能遇到的問題的解決方案。