「这是我参与11月更文挑战的第3天,活动详情检查:2021最终一次更文挑战」。

当咱们经过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项目,还有额外的可选字段如:authorhomepageissue_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_blocversion6.1.3,咱们的运用程序运用的是 version7.3.2。可是,咱们需求运用 version 运行咱们的运用程序7.3.3,因此咱们掩盖了依靠项。经过这样做,当pubspec编译一切依靠项的列表时,它将运用 version7.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