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

Dir*_*irv 7 dart

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

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

谢谢.

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

Jaw*_*ngh 25

仅适用于颤振

请使用来自 flutter 社区的这个新包package_info_plus

import 'package:package_info_plus/package_info_plus.dart';

PackageInfo packageInfo = await PackageInfo.fromPlatform();

String appName = packageInfo.appName;
String packageName = packageInfo.packageName;
String version = packageInfo.version;
String buildNumber = packageInfo.buildNumber;
Run Code Online (Sandbox Code Playgroud)

以下解决方案已被弃用。

我知道 OP 想要阅读,YAML但对于 Flutter 开发者,你们可以使用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;
Run Code Online (Sandbox Code Playgroud)

  • 我同意你的看法。但是,我已经给出了免责声明,这是为了 flutter,开发人员可以阅读版本和其他信息。别误会我的意思。我确实遵循 StackOverflow 指南 :) (5认同)
  • 与主题完全无关 (3认同)
  • 如果您希望您的应用程序在 Web、Android 和 IOS 上运行,请改用“Package info_plus”。https://pub.dev/packages/package_info_plus。 (2认同)

Rob*_*ert 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']);
  });
}
Run Code Online (Sandbox Code Playgroud)

输出看起来类似于:

test_cli
A sample command-line application
0.0.1
Robert Hartung
URL
{dart_config: any}
Run Code Online (Sandbox Code Playgroud)

编辑

您可以使用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']);
    });
}
Run Code Online (Sandbox Code Playgroud)

关心罗伯特

  • dart_config 现已过时,Dart 2 不兼容。 (6认同)
  • 但是您可以在Flutter应用程序中使用此方法读取pubspec.yaml吗 (3认同)

小智 10

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

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

assets:
  - assets/
  - pubspec.yaml
Run Code Online (Sandbox Code Playgroud)

如果您有一个小部件,您需要像这样显示应用程序版本:

...
Container(
  child: Text('Version: 1.0.0+1'),
),
...
Run Code Online (Sandbox Code Playgroud)

像这样用 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'
                ),
              );
            }),
...
Run Code Online (Sandbox Code Playgroud)

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

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

'Version: ${version.split("+")[0]}'
Run Code Online (Sandbox Code Playgroud)

更新:正如@wildsurfer 所提到的,这种方法在 Web 开发中存在潜在的安全风险,因为 pubspec.yaml 与浏览器共享!

  • 请注意,当您在 flutter web 应用程序中这样做时,浏览器将获取您的 pubspec.yml 文件。这是一个潜在的安全风险。 (3认同)

Wes*_*y92 8

您可以使用Dart 团队的pubspec.yaml官方包访问属性。pubspec_parse

dart pub add pubspec_parse
Run Code Online (Sandbox Code Playgroud)
dart pub add pubspec_parse
Run Code Online (Sandbox Code Playgroud)

然后您可以访问parsed对象的类型化属性。

您可以在此处找到支持的属性:https ://pub.dev/documentation/pubspec_parse/latest/pubspec_parse/Pubspec-class.html 。


Bre*_*ton 5

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

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

因此,您需要获取与库可执行路径相关的 pubspec.yaml。

此示例使用 'paths' 包,但不是必需的。

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

import 'package:path/path.dart'; 

String pathToYaml =  join(dirname(Platform.script.toFilePath()), '../pubspec.yaml');
Run Code Online (Sandbox Code Playgroud)

您现在可以阅读 yaml:

import 'package:path/path.dart'; 
import 'package:yaml/yaml.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']);
    });                                       
Run Code Online (Sandbox Code Playgroud)