Access to pubspec.yaml attributes (version) from Dart app

前端 未结 4 1765
孤街浪徒
孤街浪徒 2020-12-06 02:05

Is there any way to access some of the attributes listed in a pubspec.yaml file in that files Dart application?

In particular, the version and description attribute

相关标签:
4条回答
  • 2020-12-06 02:06

    So assuming that this is for a dart cli application then the @Robert suggestion won't work.

    dart_config isn't available for dart 2.x and your pubspec.yaml isn't going to be relative to your cwd except when you are in your development environment

    So you need to get the pubspec.yaml relative to the libraries executable path.

    This example uses the 'paths' package but it isn't required.

    This can be obtained by:

    import 'package:path/path.dart'; 
    
    String pathToYaml =  join(dirname(Platform.script.toFilePath()), '../pubspec.yaml');
    

    You can now read the 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']);
        });                                       
    
    0 讨论(0)
  • 2020-12-06 02:15

    FOR FLUTTER ONLY

    I know the OP wants to read YAML but for flutter dev's you guys can read the version and other info of the application using package_info.

    This is the sample to fetch details from Android/iOS application.

    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;
    
    0 讨论(0)
  • 2020-12-06 02:21

    you can install the "dart_config" package and use this code to parse a pubspec.yaml file:

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

    The output looks similar to this:

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

    EDIT

    You can do it with the Yaml package itself:

    *NOTE: this will not work on 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']);
        });
    }
    

    Regards Robert

    0 讨论(0)
  • 2020-12-06 02:26

    None of the above answers worked for me, but here's a working solution for a Flutter app:

    In your pubspec.yaml add the "pubspec.yaml" to assets:

    assets:
      - assets/
      - pubspec.yaml
    

    If you have a widget where you need to show the app version like this:

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

    Wrap your widget with a FutureBuilder like this:

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

    The services rootBundle property contains the resources that were packaged with the application when it was built.

    If you want to show the version without the build number, you can split the string like so:

    'Version: ${version.split("+")[0]}'
    
    0 讨论(0)
提交回复
热议问题