从Dart应用程序访问pubspec.yaml属性(版本)

iq0todco  于 2023-01-10  发布在  其他
关注(0)|答案(7)|浏览(217)

有没有办法在pubspec.yaml文件的Dart应用程序中访问该文件中列出的一些属性?
特别是,version和description属性在版本信息对话框中可能非常有用,甚至在使用控制台应用程序时显示"--version"。我还没有找到在API中访问的方法。我不确定镜像是否有合适的属性,但如果Web应用程序编译为JS,那么我在输出JS中看不到描述。
谢谢。

    • 编辑**

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

sdnqo3pr

sdnqo3pr1#

仅适用于Flutter
请使用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;
以下溶液已作废。

我知道OP想要读取YAML,但是对于flutter dev,你们可以使用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;
tv6aics1

tv6aics12#

您可以安装"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软件包本身:

  • 注意:这在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']);
    });
}

问候罗伯特

ymdaylpp

ymdaylpp3#

以上答案对我都不起作用,但下面是一个Flutter应用的有效解决方案:
在pubspec.yaml中,将“pubspec.yaml”添加到资产中:

assets:
  - assets/
  - pubspec.yaml

如果您有一个需要显示应用版本的小部件,如下所示:

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

用FutureBuilder Package 小部件,如下所示:

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

services rootBundle属性包含生成应用程序时与应用程序打包在一起的资源。
如果您想显示不带内部版本号的版本,可以按如下方式拆分字符串:

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

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

fkvaft9z

fkvaft9z4#

因此,假设这是针对dart cli应用程序的,那么@Robert的建议将不起作用。
dart_config不适用于dart2.x,并且pubspec.yaml不会相对于cwd,除非您处于开发环境中
因此,您需要获取相对于库可执行路径的pubspec.yaml。
这个例子使用了'paths'包,但它不是必需的。
这可以通过以下方式获得:

import 'package:path/path.dart'; 

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

现在可以阅读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']);
    });
rta7y2nd

rta7y2nd5#

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

如果您希望应用在**Web**、AndroidIOS上运行,请改用“Package info_plus“。

yacmzcpb

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”:

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",
};

最初创建meta.dart文件时,从pubspec. yaml复制特定信息。以后每次运行MetaUpdate.writeMetaDartFile()时,该信息都会被覆盖,每当pubspec.yaml中的信息发生更改时,内容也会随之更改。

3.在测试代码中实现版本更新

在测试代码(不是主程序的源代码,我们不希望它被编译成二进制文件)的Main()的第一行添加以下代码,并根据需要更改 meta.dart的路径:

MetaUpdate("pubspec.yaml").writeMetaDartFile("lib/src/meta.dart");

4.向主代码添加 meta检查

将其放入应用的代码中,使其成为应用运行时最先执行的方法之一-如果 meta.dart和pubspec.yaml中显示的属性之间存在差异,它将生成异常:

MetaUpdate("pubspec.yaml").verifyLatestVersionFromPubSpec();

5.使用

  • 确保pubspec.yaml中的Name、Version和Description信息包含您希望在代码中反映的最新信息。
  • 导入“ meta.dart”并在需要显示meta ['name']、meta ['version']等的地方插入meta ['name']、meta ['version']等(例如,在要打印到控制台的--help或--version消息中)。
  • 只要在编译代码之前运行测试, meta信息就会准确地反映在代码中。
jum4pzuy

jum4pzuy7#

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

dart pub add pubspec_parse
import 'dart:io';
import 'package:pubspec_parse/pubspec_parse.dart';

final pubspec = File('pubspec.yaml').readAsStringSync();
final parsed = Pubspec.parse(pubspec);

然后可以访问parsed对象的类型化属性。
您可以在此处找到支持的属性:https://pub.dev/documentation/pubspec_parse/latest/pubspec_parse/Pubspec-class.html.

相关问题