likes
comments
collection
share

Flutter 项目结构篇之- pubspec.yaml

作者站长头像
站长
· 阅读数 5

当我们通过flutter create xxx 新建一个项目,项目里面会包含pubspec.yamlpubspec.lockanalysis_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) 上发布我们的包,那么每个人都可以看到这个描述。

Flutter 项目结构篇之- pubspec.yaml

version将允许我们向应用程序或库添加语义版本控制。对于移动应用程序,这将是出现在 各个应用商店的版本。带有 version 的 Flutter 应用程序1.2.3+4意味着它是1.2.3带有 build version 的版本 4。另一方面,如果我们正在创建library,版本控制将使任何用户能够指定他们想要使用哪个版本的库,让他们决定是否使用。 dio: ^4.0.1dio: 3.0.10。另外如果我们创建了一个library项目,还有额外的可选字段如:author, homepageissue_trackerrepository

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*中可以看到:

Flutter 项目结构篇之- pubspec.yaml

Environment

这个字段允许我们对Dart SDKFlutter 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

dependenciesdev_dependencies包含我们要在应用程序中使用中的所有包。 ependencies:是任何使用你的包的人也需要的包。仅在包本身的开发阶段需要的依赖项列在dev_dependencies。在开发过程中,您可能需要临时覆盖依赖项。您可以使用dependency_overrides

在声明对特定包的依赖项时,我们必须首先知道添加它们的不同方法:

来自pub.dev 上托管的包的依赖

我们转到pub.dev,选择一个我们需要的包,例如flutter_bloc并转到install部分以查看如何将其添加到我们的项目中 - 通过直接pubspec.yaml在该dependencies部分的文件中添加依赖项:

Flutter 项目结构篇之- pubspec.yaml

  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
  • urlgit存储库地址
  • ref 可以是提交散列标签分支 (Git中参考)。
  • path是,如果git仓库有几个程序包中使用。如果我们查看bloc官方 github 存储库,我们会看到里面packages是所有bloc相关的项目,包括blocflutter_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_blocversion 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