Flutter版本控制信息插件commit_info的使用

Flutter版本控制信息插件commit_info的使用

概述

commit_info 是一个用于在Dart项目中安全获取版本控制信息的小工具。在原型或开发阶段,你可能需要你的应用程序包含从哪个特定提交构建的信息。但由于Flutter构建系统的工作方式,这可能会变得具有挑战性,甚至可能需要一些hack。

commit_info 可以创建一个名为 commit_info.g.dart 的文件,其格式如下:

class CommitInfo {
  final String commitId;
  final String commitIdShort;
  final int? timestamp;
  final String? branch;
  final bool? localChanges;

  const CommitInfo({
    required this.commitId,
    required this.commitIdShort,
    required this.timestamp,
    required this.branch,
    this.localChanges = false,
  });

  DateTime? get dateTime => timestamp == null ? null : DateTime.fromMicrosecondsSinceEpoch(timestamp!);
}

const CommitInfo? commitInfo = CommitInfo(
  commitId: "2685ecba8f68feae8f42acb3bc001e73a9290cc5",
  commitIdShort: "2685ecb",
  timestamp: 1693745311,
  branch: "main",
  localChanges: true,
);

你可能希望将此文件添加到 .gitignore 中,以避免在构建过程中出现错误的版本信息。(是的,我知道我也能生成该文件到构建缓存中,但Flutter在那里找不到它……)

目前,它仅支持Git,但它被设计为与版本控制系统无关,支持其他版本控制系统应该很容易实现。

当然,它没有任何Flutter依赖项,因此你也可以在任何Dart项目中使用它。事实上,如果你用 build 构建项目,它应该更有用,因为它会无缝集成。

开始使用

要添加 commit_info 插件,请运行以下命令:

flutter pub add dev:commit_info dev:build_runner

唯一的前提条件是,你所使用的版本控制系统所需的命令行工具必须在任何你想运行此插件的环境中可用(包括CI)。

使用示例

要使用 commit_info,只需导入并使用 commitInfo 常量。

import 'commit_info.g.dart';

class CommitInfoWidget extends StatelessWidget {
  const CommitInfoWidget({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) => Text((commitInfo == null)
      ? "unknown"
      : "commit ${commitInfo!.commitIdShort} on ${commitInfo!.branch}, from ${commitInfo!.timestamp}${commitInfo!.localChanges ? " (with local changes)" : ""}");
}

你可以在该库的git仓库中的 example 文件夹里找到一个稍微复杂一点的例子。

由于截至撰写时,Flutter构建工具还不支持扩展,你需要在构建应用之前手动运行构建器。你可以通过以下命令行来完成:

dart run build_runner build

在CI环境中,只需在 flutter build 步骤之前添加上述命令即可。在开发环境中,没有必要每次构建都运行它;每段编码会话运行一次或者在需要准确信息时每次提交运行一次就足够了。如果你更喜欢从编辑器或IDE运行Flutter,可以添加一个动作来为你运行它。

如果你不想在CI中运行它,可以使用以下命令来创建一个 nullCommitInfo

dart run commit_info:initialize

这将会创建一个包含 null CommitInfocommit_info.g.dart 文件。

你也可以运行这个命令来创建一个 nullCommitInfo 并将其推送到版本控制系统,作为替代方案,而不是 .gitignore 生成的文件。虽然这有点麻烦,因为你每次提交前都需要回退这个文件,但这是一种选择。

完整示例

以下是一个完整的示例代码,展示了如何在Flutter项目中使用 commit_info 插件:

// main.dart
import 'package:flutter/material.dart';
import 'commit_info.g.dart'; // 导入生成的commit_info文件

class MyApp extends StatelessWidget {
  final SettingsController settingsController;

  MyApp({required this.settingsController});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Demo Home Page'),
        ),
        body: Center(
          child: CommitInfoWidget(),
        ),
      ),
    );
  }
}

class CommitInfoWidget extends StatelessWidget {
  const CommitInfoWidget({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text((commitInfo == null)
        ? "unknown"
        : "commit ${commitInfo!.commitIdShort} on ${commitInfo!.branch}, from ${commitInfo!.timestamp}${commitInfo!.localChanges ? " (with local changes)" : ""}");
  }
}

更多关于Flutter版本控制信息插件commit_info的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter版本控制信息插件commit_info的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用commit_info插件来获取版本控制信息的代码示例。commit_info插件允许你从Git仓库中提取提交信息,如commit hash、author、message等,并在你的Flutter应用中使用这些信息。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加commit_info依赖:

dependencies:
  flutter:
    sdk: flutter
  commit_info: ^2.0.0  # 确保使用最新版本,检查pub.dev获取最新版本号

然后运行flutter pub get来安装依赖。

2. 配置build.yaml

为了让commit_info插件能够正常工作,你需要在项目根目录下的build.yaml文件中添加以下配置:

targets:
  $default:
    builders:
      commit_info:
        enabled: true

如果你的项目中没有build.yaml文件,你需要创建一个。

3. 使用CommitInfo

在你的Flutter应用中,你可以通过CommitInfo类来获取Git提交信息。以下是一个简单的示例,展示如何在你的应用中显示commit hash和commit message:

import 'package:flutter/material.dart';
import 'package:commit_info/commit_info.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String? commitHash;
  String? commitMessage;

  @override
  void initState() {
    super.initState();
    _loadCommitInfo();
  }

  Future<void> _loadCommitInfo() async {
    try {
      final info = await CommitInfo.fromCurrentPackage();
      setState(() {
        commitHash = info.hash;
        commitMessage = info.message?.trim(); // 去掉可能存在的前后空格
      });
    } catch (e) {
      print('Failed to load commit info: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Commit Info Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Commit Hash:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              commitHash ?? 'Loading...',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            Text(
              'Commit Message:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              commitMessage ?? 'Loading...',
              style: TextStyle(fontSize: 18),
              maxLines: 3,
              overflow: TextOverflow.ellipsis,
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

确保你的项目在一个Git仓库中,并且有提交记录。然后运行你的Flutter应用:

flutter run

你应该能够在应用中看到当前Git提交的hash和message。

注意

  • commit_info插件依赖于Git命令行工具。确保你的开发环境中已经安装了Git,并且能够在命令行中访问。
  • 如果你在一个没有Git历史记录的包或项目中尝试使用这个插件,它将无法正常工作。

这样,你就可以在你的Flutter应用中使用commit_info插件来获取和显示版本控制信息了。

回到顶部