从Dart app访问pubspec.yaml属性(版本)

时间:2014-05-12 15:38:47

标签: dart

有没有办法访问该文件Dart应用程序中pubspec.yaml文件中列出的某些属性?

特别是,在版本信息对话框中看到版本和描述属性可能非常有用,或者在使用控制台应用程序时甚至是“--version”。我无法在API中找到访问方式。我不确定Mirrors是否有任何合适的东西,但如果一个Web应用程序被编译为JS,那么我在输出JS的任何地方都看不到描述。

感谢。

修改
功能请求:https://code.google.com/p/dart/issues/detail?id=18769

5 个答案:

答案 0 :(得分:12)

您可以安装“dart_config”包并使用此代码解析pubspec.yaml文件:

import 'package:dart_config/default_server.dart';
import 'dart:async';

void main() {
  Future<Map> conf = loadConfig("../pubspec.yaml");
  conf.then((Map config) {
    print(config['name']);
    print(config['description']);
    print(config['version']);
    print(config['author']);
    print(config['homepage']);
    print(config['dependencies']);
  });
}

输出类似于:

test_cli
A sample command-line application
0.0.1
Robert Hartung
URL
{dart_config: any}

修改

您可以使用Yaml包本身:

import 'package:yaml/yaml.dart';
import 'dart:io';

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']);
    });
}

关心罗伯特

答案 1 :(得分:5)

以上答案均不适合我,但这是 Flutter 应用的有效解决方案:

在您的pubspec.yaml中,将“ pubspec.yaml”添加到资产:

assets:
  - assets/
  - pubspec.yaml

如果您有一个小部件,需要在其中显示如下应用程序版本:

...
Container(
  child: Text('Version: 1.0.0+1'),
),
...

用这样的FutureBuilder包装小部件:

import 'package:flutter/services.dart';
import 'package:yaml/yaml.dart';

...
        FutureBuilder(
            future: rootBundle.loadString("pubspec.yaml"),
            builder: (context, snapshot) {
              String version = "Unknown";
              if (snapshot.hasData) {
                var yaml = loadYaml(snapshot.data);
                version = yaml["version"];
              }

              return Container(
                child: Text(
                  'Version: $version'
                ),
              );
            }),
...

服务rootBundle属性包含构建应用程序时与应用程序打包的资源。

如果要显示不带内部版本号的版本,可以像这样拆分字符串:

'Version: ${version.split("+")[0]}'

答案 2 :(得分:2)

仅适用于 Flutter(WebAndroidIOS)...自 2020 年 10 月起

如果您希望您的应用在 Web 上运行,AndroidIOS 使用“Package info_plus”代替。

答案 3 :(得分:1)

我知道OP希望阅读YAML,但对于开发者来说,您可以使用package_info阅读应用程序的版本和其他信息。

这是从Android / iOS应用程序获取详细信息的示例。

import 'package:package_info/package_info.dart';

PackageInfo packageInfo = await PackageInfo.fromPlatform();

String appName = packageInfo.appName;
String packageName = packageInfo.packageName;
String version = packageInfo.version;
String buildNumber = packageInfo.buildNumber;

答案 4 :(得分:0)

因此,假设这是针对dart cli应用程序的,则@Robert建议将不起作用。

dart_config不适用于dart 2.x,除非您处于开发环境中,否则您的pubspec.yaml不会与cwd相关。

因此,您需要获取相对于库可执行文件路径的pubspec.yaml。

此示例使用“路径”包,但这不是必需的。

这可以通过以下方式获得:


import 'package:path/path.dart';

String pathToYaml =  join(dirname(Platform.script.toFilePath()), '../pubspec.yaml'));

您现在可以阅读Yaml:

import 'package:path/path.dart';

String pathToYaml =  join(dirname(Platform.script.toFilePath()), '../pubspec.yaml'));

File f = new File(pathToYaml);
String yamlText =   f.readAsStringSync();
      Map yaml = loadYaml(yamlText);
      print(yaml['name']);
      print(yaml['description']);
      print(yaml['version']);
      print(yaml['author']);
      print(yaml['homepage']);
      print(yaml['dependencies']);
    });