在Flutter问题记录 - Flutter插件创建Package项目报错:At least one platform must be selected文章中初步确定Flutter创建Package项目选择支持的平台是无效的,但同时在Pub仓库又能看到一些Package类型的库显示只支持部分平台,带着这个疑问我写下了这篇文章。
创建Flutter Package项目时无法选择平台,奇怪的是在Pub仓库又能看到一些Package类型的库显示只支持部分平台,再者如果确实有这样的需求,该怎么设置只支持部分平台呢?
Pub仓库中两个显示只支持部分平台的示例:
示例一:mason
示例二:build_runner
查看pubspec.yaml文件,可以看到里面并没有平台相关的声明,那为什么会不支持Web平台呢?
name: mason
description: >
A Dart template generator which helps teams generate files quickly and consistently.
version: 0.1.0-dev.40
homepage: https://github.com/felangel/mason
repository: https://github.com/felangel/mason
issue_tracker: https://github.com/felangel/mason/issues
documentation: https://github.com/felangel/mason/tree/master/packages/mason_cli#readme
environment:
sdk: ">=2.16.0 <3.0.0"
dependencies:
archive: ^3.1.11
checked_yaml: ^2.0.1
collection: ^1.15.0
convert: ^3.1.0
crypto: ^3.0.1
http: ^0.13.3
json_annotation: ^4.4.0
mason_logger: ^0.2.2
meta: ^1.7.0
mustache_template: ^2.0.0
path: ^1.8.0
pool: ^1.5.1
pub_semver: ^2.1.0
recase: ^4.0.0
yaml: ^3.1.0
dev_dependencies:
build_runner: ^2.0.0
build_verify: ^3.0.0
build_version: ^2.0.0
json_serializable: ^6.0.0
mocktail: ^0.3.0
test: ^1.17.0
very_good_analysis: ^2.4.0
点开这个库在Pub仓库里的Scores,找到Platform support
,点开查看详情:
可以看到Package不兼容Web平台的原因是使用了dart:io
,dart:io
库不支持Web平台,依赖dart:io
库的Package自然被Pub当作不支持Web平台。
查看pubspec.yaml文件,可以看到里面有关于平台的声明platforms
。
name: build_runner
version: 2.3.4-dev
description: A build system for Dart code generation and modular compilation.
repository: https://github.com/dart-lang/build/tree/master/build_runner
environment:
sdk: ">=2.14.0 <3.0.0"
platforms:
linux:
windows:
macos:
dependencies:
args: ^2.0.0
async: ^2.5.0
analyzer: '>=4.4.0 <6.0.0'
build: ">=2.1.0 <2.4.0"
build_config: ">=1.1.0 <1.2.0"
build_daemon: ^3.1.0
build_resolvers: ^2.0.0
build_runner_core: ^7.2.0
code_builder: ^4.2.0
collection: ^1.15.0
crypto: ^3.0.0
dart_style: ^2.0.0
frontend_server_client: ^3.0.0
glob: ^2.0.0
graphs: ^2.0.0
http_multi_server: ^3.0.0
io: ^1.0.0
js: ^0.6.3
logging: ^1.0.0
meta: ^1.3.0
mime: ^1.0.0
package_config: ^2.0.0
path: ^1.8.0
pool: ^1.5.0
pub_semver: ^2.0.0
pubspec_parse: ^1.0.0
shelf: ^1.0.0
shelf_web_socket: ^1.0.0
stack_trace: ^1.10.0
stream_transform: ^2.0.0
timing: ^1.0.0
watcher: ^1.0.0
web_socket_channel: ^2.0.0
yaml: ^3.0.0
dev_dependencies:
build_test: ^2.0.0
build_web_compilers: ^3.0.0
lints: '>=1.0.0 <3.0.0'
stream_channel: ^2.0.0
test: ^1.16.0
test_descriptor: ^2.0.0
test_process: ^2.0.0
_test_common:
path: ../_test_common
点开这个库在Pub仓库里的Scores,找到Platform support
,点开查看详情:
可以看到Package只兼容Windows/Linux/MacOS平台的原因是有声明,那我在已经创建好的Flutter Package项目里加上平台声明是不是能限制依赖?经测试是不行的,该依赖还是依赖,其实不用测也知道,大部分人应该都用过json_serializable吧,这个库用于JSON序列化,用到了dart:mirrors
(反射)和dart:io
,被Pub仓库识别为不兼容Android/iOS/Web平台,但Flutter开发时还是可以依赖这个库通过反射生成JSON序列化相关代码。所以,Package的平台支持是不会限制你依赖的,但只要你用在了不支持的平台或不对的时机,那可能就无法正常使用了。
通过以上两个示例,现在大致可以知道为什么有些库显示只支持某些平台的原因,一是使用了不兼容全平台的API,二是显式声明了支持的平台。
但是好像这两个示例的pubspec.yaml
内容和Flutter Package项目的pubspec.yaml
内容有点不一样,最明显的是没有默认依赖Flutter SDK,之所以没有依赖Flutter SDK,这是因为以上两个示例是Dart Package项目。
感兴趣的可以自己创建一个Dart Package项目,如果你用的是Android Studio,可以通过[File]->[New]->[New Flutter Project…]->[Dart]创建,点击[Next]前要检查Dart SDK路径。
也可以通过命令行创建:
dart create 项目名称 -t package
在Pub仓库翻了翻,发现不支持全平台的Package大部分都是Dart Package项目,当然,Flutter Package项目也是有的,例如腾讯IM相关的tencent_cloud_chat_uikit,这个库是显式声明只支持Android/iOS/Web平台。所以,虽然创建Flutter Package项目时无法选择平台,但是可以手动显式声明需要支持的平台。
如果创建的Flutter Package项目明确只支持部分平台,那么可以显式声明支持的平台,如果不确定,可以交给Pub仓库自动检测。
pubspec文件关于Platforms
字段的说明与使用:
熬夜把这篇文章补完了。
如果这篇文章对你有所帮助,请不要吝啬你的点赞加星,谢谢~