Flutter 项目结构篇之- pubspec.yaml
当我们通过flutter create xxx 新建一个项目,项目里面会包含pubspec.yaml
、pubspec.lock
和analysis_options.yaml
文件。在本文中,我们将探讨该pubspec.yaml
文件 - 它是什么以及我们可以用它做什么。
当我们新建一个 Flutter Project 的时候,我们通常会有如下的文件结构如下:
├── android
├── ios
├── lib
├── pubspec.yaml
├── pubspec.lock
├── analysis_options.yaml
├── test
├── web
└── README.md
那么今天聊的这个pubspec.yaml
文件里面到底是什么?让我们点进去看一下😁:
# General Section (Metadata)
name: new_test
description: A new Flutter project.
publish_to: 'none'
version: 1.0.0+1
# Environment
environment:
sdk: ">=2.12.0 <3.0.0"
# Dependencies
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^1.0.0
# Flutter specific configurations
flutter:
uses-material-design: true
基本信息 - Metadata
name
. 此字段指示包名称,以及我们将如何在此项目中或从此项目导入文件。例如,如果在一个文件中我们要导入main.dart
函数,则导入如下:
import 'package:new_test/main.dart';
但是,如果将来我们将name
字段更改 为new_app
,我们必须确保将所有导入从new_test
更改为new_app
,这意味着我们的main.dart
导入将如下所示:
import 'package:new_app/main.dart';
description
顾名思义是可以让我们为项目添加一个简短的描述(该字段是一个可选字段)。如果我们正在创建一个library
,那么如果我们决定在 [pub.dev](https://app pub.dev) 上发布我们的包,那么每个人都可以看到这个描述。
version
将允许我们向应用程序或库添加语义版本控制。对于移动应用程序,这将是出现在 各个应用商店的版本。带有 version 的 Flutter 应用程序1.2.3+4
意味着它是1.2.3
带有 build version 的版本 4
。另一方面,如果我们正在创建library
,版本控制将使任何用户能够指定他们想要使用哪个版本的库,让他们决定是否使用。 dio: ^4.0.1
或dio: 3.0.10
。另外如果我们创建了一个library
项目,还有额外的可选字段如:author
, homepage
,issue_tracker
和repository
。
author: xxx
repository: https://github.com/felangel/bloc/tree/master/packages/flutter_bloc
issue_tracker: https://github.com/felangel/bloc/issues
homepage: https://bloclibrary.dev
这些字段也将显示在pub.dev右侧的* Metadata*中可以看到:
Environment
这个字段允许我们对Dart SDK
和Flutter Version
都添加约束:
environment:
sdk: ">=2.12.0 <3.0.0"
这意味着这个Project将只Dart SDK版本上运行高于或等于比2.12.0
,但低比3.0.0
。我们不关心它当前使用的是哪个特定版本,只需要它保持在界限之间而已。
此外,我们还可以使用参数来规定我们将要使用的Flutter版本:
environment:
sdk: ">=2.12.0 <3.0.0"
flutter: "2.5.0"
在这种情况下,如果我们使用 Flutter 版本的2.5.0
. 如果我们尝试通过flutter pub get
使用任何其他 Flutter 版本获取我们的包,我们将看到以下错误:
➜ example flutter pub get
The current Flutter SDK version is 2.1.0.
Because example requires Flutter SDK version 2.5.0, version solving failed.
Running "flutter pub get" in example...
pub get failed (1; Because example requires Flutter SDK version 2.5.0, version solving failed.)
Dependencies
dependencies
和dev_dependencies
包含我们要在应用程序中使用中的所有包。
ependencies:
是任何使用你的包的人也需要的包。仅在包本身的开发阶段需要的依赖项列在dev_dependencies
。在开发过程中,您可能需要临时覆盖依赖项。您可以使用dependency_overrides
。
在声明对特定包的依赖项时,我们必须首先知道添加它们的不同方法:
来自pub.dev 上托管的包的依赖
我们转到pub.dev,选择一个我们需要的包,例如flutter_bloc并转到install
部分以查看如何将其添加到我们的项目中 - 通过直接pubspec.yaml
在该dependencies
部分的文件中添加依赖项:
dependencies:
flutter_bloc: ^7.3.3
来自路径目录的依赖
当我们需要写一个自己的包或者对于一些线上的包进行自定义的整改。就需要编译本地版本。为此我们必须使用path
引用。
dependencies:
bloc:
path: ../custom_flutter_bloc
来自git 存储库的依赖
dependencies:
bloc:
git:
url: https://github.com/felangel/bloc/tree/master/packages/flutter_bloc.git
ref: flutter_bloc_custom
path: packages/flutter_bloc
url
是git
存储库地址ref
可以是提交散列、标签、分支 (Git中参考)。path
是,如果git仓库有几个程序包中使用。如果我们查看bloc
官方 github 存储库,我们会看到里面packages
是所有bloc
相关的项目,包括bloc
和flutter_bloc
。
来自自定义发布服务器的依赖
最后将自己的包或者将自定义的包提交自己的pub 服务器,那么就必须让pubspec
知道我们正在使用不同的 pub 服务器。这可以通过添加hosted
参数轻松完成:
dependencies:
bloc:
hosted:
name: flutter_bloc
url: http://your-package-server.com
version: ^6.0.0
dependency_overrides
想象一下以下场景:我们使用flutter_bloc
带有 version的包7.3.2
,但同时我们依赖另一个使用 version 的包6.1.3
。如果我们尝试获取应用程序的依赖项,则会收到以下错误:
➜ example: flutter pub get
Because main_app depends on package from path which depends on flutter_bloc 6.1.3, flutter_bloc 6.1.3 is required.
So, because main_app depends on flutter_bloc 7.3.2, version solving failed.
Running "flutter pub get" in main_app...
pub get failed (1; So, because main_app depends on flutter_bloc 7.3.2, version solving failed.)
那么我们就可以通过使用dependency_overrides
方法覆盖依赖项:
dependencies:
flutter_bloc: 7.3.2
package:
path: ../package
dependency_overrides:
flutter_bloc: 7.3.3
总结:我们package
使用的是flutter_bloc
version 6.1.3
,我们的应用程序使用的是 version 7.3.2
。但是,我们需要使用 version 运行我们的应用程序7.3.3
,因此我们覆盖了依赖项。通过这样做,当pubspec
编译所有依赖项的列表时,它将使用 version 7.3.3
,无论每个应用程序或库规定什么:
当获取带有这个新字段的包时,我们会看到一条新的警告消息,指出我们正在使用覆盖的依赖项:
➜ example: flutter pub get
Warning: You are using these overridden dependencies:
! flutter_bloc 6.0.6
Running "flutter pub get" in main_app...
但是,请注意。将 dependency_overrides
只会被用于在我们编译应用程序。这意味着如果我们有一个dependency_overrides
关于我们的部分package
,并且我们编译example
应用程序,example
应用程序将忽略所有其他库的依赖覆盖。
Flutter 部分
在我们文件的底部,我们看到一个名为flutter
. 创建新项目时,我们看到它已经有一个参数uses-material-design
:
flutter:
uses-material-design: true
这里是我们配置Flutter地方,例如资源和字体等:
flutter:
uses-material-design: true
assets:
- images/icon_home_add.jpeg
- images/icon_home_delete.jpeg
fonts:
- family: Schyler
fonts:
- asset: fonts/Schyler-Italic.ttf
style: italic
weight: 700
还用于在创建插件包时设置每个平台的插件版本。
flutter:
plugin:
platforms:
android:
package: io.flutter.plugins.xwuppay
pluginClass: XWUPPayPlugin
ios:
pluginClass: XWUPPayPluginPlugin
macos:
default_package: xwuppay_macos
web:
default_package: xwuppay_for_web
最后
该pubspec.yaml
文件对所有应用程序和包都是横向的——它是我们向项目添加元数据、规定 Dart 和 Flutter SDK 约束、管理依赖项以及设置 Flutter 特定配置的地方。
然而,我们没有看到的一件事是我们获得包后会发生什么(flutter pub get
例如通过)。特别是pubspec.lock
文件会发生什么。这将是未来文章的主题,除其他事项外,我们将看到^
在声明pub.dev依赖项时使用的符号是什么,以及为什么我们应该或不应该使用它。这些都将在一下篇进行说明。
要查看我们可以使用的所有字段的列表,以及更多的字段信息请查看官方的The pubspec file
转载自:https://juejin.cn/post/7028559401543794696