test_cli
A sample command-line application
0.0.1
Robert Hartung
URL
{dart_config: any}
编辑**
您可以使用Yaml软件包本身:
注意:这在Flutter Web上无效
import 'package:yaml/yaml.dart';
import 'dart:io'; // *** NOTE *** This will not work on Flutter Web
void main() {
File f = new File("../pubspec.yaml");
f.readAsString().then((String text) {
Map yaml = loadYaml(text);
print(yaml['name']);
print(yaml['description']);
print(yaml['version']);
print(yaml['author']);
print(yaml['homepage']);
print(yaml['dependencies']);
});
}
import 'dart:io';
import 'package:yaml/yaml.dart';
import 'meta.dart';
class MetaUpdate {
String pathToYaml = "";
String metaDartFileContents = "";
MetaUpdate(this.pathToYaml);
void writeMetaDartFile(String metaDartFilePath) {
File metaDartFile = File(metaDartFilePath);
String metaDartFileContents = """
/// DO NOT EDIT THIS FILE EXCEPT TO ENTER INITIAL VERSION AND OTHER META INFO
/// THIS FILE IS AUTOMATICALLY OVER WRITTEN BY MetaUpdate
Map<String, String> meta = <String, String>{
"name": "${getPubSpec('name')}",
"description":
// ignore: lines_longer_than_80_chars
"${getPubSpec('description')}",
"version":"${getPubSpec('version')}",
};
""";
metaDartFile.writeAsStringSync(metaDartFileContents);
}
String getPubSpec(String pubSpecParam) {
File f = File(pathToYaml);
String yamlText = f.readAsStringSync();
// ignore: always_specify_types
Map yaml = loadYaml(yamlText);
return yaml[pubSpecParam];
}
void verifyLatestVersionFromPubSpec() {
try {
File f = File(pathToYaml);
//exit if no pubspec found so no warning in production
if (!f.existsSync()) return;
//compare meta.dart with pubspec meta and give warning if difference
if (meta.keys
.where((dynamic e) => (meta[e] != getPubSpec(e)))
.isNotEmpty) {
throw Exception(
"""Version number and other meta attributes in code are different from pubspec.yaml. Please check pubspec.yaml and then run test so that MetaUpdate can update meta information in code, then recompile""");
}
} on Exception {
rethrow;
}
}
}
2.创建一个“ meta.dart”文件:
/// DO NOT EDIT THIS FILE EXCEPT TO ENTER INITIAL VERSION AND OTHER META INFO
/// THIS FILE IS AUTOMATICALLY OVER WRITTEN BY MetaUpdate
Map<String, String> meta = <String, String>{
"name": "Acme Transmogrifier",
"description":
"The best dart application ever.",
"version":"2021.09.001",
};
7条答案
按热度按时间sdnqo3pr1#
仅适用于Flutter
请使用flutter社区提供的新软件包package_info_plus。
以下溶液已作废。
我知道OP想要读取
YAML
,但是对于flutter dev,你们可以使用package_info读取应用程序的版本和其他信息。这是从Android/iOS应用程序获取详细信息的示例。
tv6aics12#
您可以安装"dart_config"包并使用以下代码解析pubspec. yaml文件:
输出如下所示:
您可以使用Yaml软件包本身:
问候罗伯特
ymdaylpp3#
以上答案对我都不起作用,但下面是一个Flutter应用的有效解决方案:
在pubspec.yaml中,将“pubspec.yaml”添加到资产中:
如果您有一个需要显示应用版本的小部件,如下所示:
用FutureBuilder Package 小部件,如下所示:
services rootBundle属性包含生成应用程序时与应用程序打包在一起的资源。
如果您想显示不带内部版本号的版本,可以按如下方式拆分字符串:
**更新:**正如@wildsurfer提到的,这种方法在Web开发中存在潜在的安全风险,因为pubspec.yaml是与浏览器共享的!
fkvaft9z4#
因此,假设这是针对dart cli应用程序的,那么@Robert的建议将不起作用。
dart_config不适用于dart2.x,并且pubspec.yaml不会相对于cwd,除非您处于开发环境中
因此,您需要获取相对于库可执行路径的pubspec.yaml。
这个例子使用了'paths'包,但它不是必需的。
这可以通过以下方式获得:
现在可以阅读yaml:
rta7y2nd5#
仅适用于房扑(
Web
、Android
和IOS
)...自2020年10月起如果您希望应用在**
Web
**、Android
和IOS
上运行,请改用“Package info_plus“。yacmzcpb6#
如何将自动版本信息合并到Dart命令行应用程序中
要更新代码中的版本信息,而不必打包要在运行时解析的资源文件,您可以将信息硬编码到自动生成的dart源文件中,该文件将编译为二进制文件。和描述信息到
meta.dart
文件中的Map对象“ meta”中。每次在开发中运行测试套件时,都会重新创建并覆盖meta.dart
文件。要验证源代码是否具有正确的版本信息,应用程序的代码将根据pubspec.yaml文件中的属性验证版本和其他 meta信息(但仅当在开发中作为解释代码运行时)。如果与pubspec.yaml有差异,则抛出异常。一旦编译成二进制,它将跳过检查,因为它找不到pubspec.yaml文件,所以不会从二进制文件中抛出错误。即使pubspec.yaml文件碰巧在附近并被找到,它也只会抛出异常,而不会创建“ meta.dart”源文件。1.创建MetaUpdate类并将其另存为“meta_update.dart”:
2.创建一个“ meta.dart”文件:
最初创建
meta.dart
文件时,从pubspec. yaml复制特定信息。以后每次运行MetaUpdate.writeMetaDartFile()时,该信息都会被覆盖,每当pubspec.yaml中的信息发生更改时,内容也会随之更改。3.在测试代码中实现版本更新
在测试代码(不是主程序的源代码,我们不希望它被编译成二进制文件)的Main()的第一行添加以下代码,并根据需要更改 meta.dart的路径:
4.向主代码添加 meta检查
将其放入应用的代码中,使其成为应用运行时最先执行的方法之一-如果 meta.dart和pubspec.yaml中显示的属性之间存在差异,它将生成异常:
5.使用
jum4pzuy7#
您可以使用Dart团队提供的官方
pubspec_parse
包访问pubspec.yaml
属性。然后可以访问
parsed
对象的类型化属性。您可以在此处找到支持的属性:https://pub.dev/documentation/pubspec_parse/latest/pubspec_parse/Pubspec-class.html.