Flutter版本控制插件git_stamp的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter版本控制插件git_stamp的使用

Git Stamp 🏷 Stamp Every App Build!

Git Stamp 是一个先进的无需等待(await-less)信息提供者和开发工具,旨在为每次应用程序构建打上Git相关信息的“戳记”。它能够帮助开发者在Flutter项目中精确记录应用版本、构建日期、分支信息及SHA等数据。以下是关于如何使用Git Stamp进行版本控制的具体说明。

🗻️ Preview

Git Config Details
Git Config Details

📑️ About (Changelog)

Why Git Stamp?

当与Flutter和Git一起工作时,特别是在团队环境中,忘记运行git pull等人为错误可能会导致分支合并期间出现问题。Git Stamp通过提供以下功能来解决这些问题:

  • Build Date, SHA & Branch Information - 精确确定部署的应用程序版本。
  • Debugging and Troubleshooting - 便于识别问题代码。
  • Avoiding Lost Changes in Teamwork - 防止因忽略git pull命令而导致的更改丢失。
  • Caching Issues in the Web Version - 帮助识别加载的是已部署版本还是过期版本。

Mechanism 🕯️

graph TD
    CODE((SOURCE CODE))--->SYNC(flutter pub get)
    SYNC--->BUILD(flutter build ...)

    subgraph "App"
        CODE
        PUB
        PUB((PACKAGES))--->CODE
    end

    subgraph "Git Stamp"
        GIT_CLI(GIT CLI)--->GENERATOR
        DART_CLI(DART CLI)--->GENERATOR
        FLUTTER_CLI(FLUTTER CLI)--->GENERATOR
    end

    subgraph "Git Stamp CLI"
        GENERATE
        ADD
    end

    GENERATOR((GENERATOR))--->ADD(~$ dart pub add git_stamp)
    ADD--->|Add package|PUB

    GENERATOR--->GENERATE(~$ dart run git_stamp)
    GENERATE--->|Create ./git_stamp directory with .dart files|CODE

🛠️ Installation

pubspec.yaml文件中添加依赖:

dependencies:
  git_stamp: ^5.2.0
dependency_overrides:
  meta: ^1.1.5

🏗️ Generating

执行生成命令:

dart run git_stamp --build-type full

💻 Usage

在需要显示Git信息的地方调用GitStamp类的方法:

import 'git_stamp/git_stamp.dart';

Text('Version: ${GitStamp.appVersion}'),
Text('Build: ${GitStamp.appBuild}'),
Text('Branch: ${GitStamp.buildBranch}'),
Text('SHA: ${GitStamp.sha}'),

或者使用GitStamp.listTile方法创建一个包含Git信息的列表项:

if (kDebugMode) ...[
  GitStamp.listTile(
    context: context,
    monospaceFontFamily: GoogleFonts.spaceMono().fontFamily,
  ),
],

示例代码

下面是一个完整的示例代码,展示了如何将Git Stamp集成到Flutter应用程序中:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart';
import 'git_stamp/git_stamp.dart';

String? get monospaceFontFamily {
  return kIsWeb ? GoogleFonts.sourceCodePro().fontFamily : 'SourceCodePro';
}

void main() {
  LicenseRegistry.addLicense(() async* {
    final license = await rootBundle.loadString('google_fonts/OFL.txt');
    yield LicenseEntryWithLineBreaks(['google_fonts'], license);
  });

  runApp(ExampleApp());
}

class ExampleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MainPage(),
      themeMode: ThemeMode.system,
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Example App'),
        actions: [
          IconButton(
            icon: Icon(Icons.settings),
            onPressed: () => navigateToSettings(context),
          ),
        ],
      ),
      body: Center(
        child: Text(
          'Example app',
          style: Theme.of(context).textTheme.headlineMedium,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => navigateToSettings(context),
        child: const Icon(Icons.add),
      ),
    );
  }

  static void navigateToSettings(BuildContext context) {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => SettingsPage()),
    );
  }
}

class SettingsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Settings Page'),
        actions: [
          GitStamp.icon(),
        ],
      ),
      body: Column(
        children: [
          FutureBuilder<int>(
            future: LicenseRegistry.licenses.length,
            builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
              return ListTile(
                title: Text('Open Source Licenses'),
                subtitle: Text(snapshot.data?.toString() ?? 'Loading'),
                leading: const Icon(Icons.gavel),
                onTap: () => GitStamp.showLicensePage(context: context),
              );
            },
          ),
          ListTile(
            title: Text('Version'),
            subtitle: Text(GitStamp.appVersion),
            leading: const Icon(Icons.numbers),
            onTap: () {},
          ),
          GitStamp.listTile(
            context: context,
            monospaceFontFamily: monospaceFontFamily,
          ),
        ],
      ),
    );
  }
}

通过以上步骤,您可以轻松地将Git Stamp集成到您的Flutter项目中,并利用其提供的强大功能来管理和跟踪应用程序的版本信息。


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

1 回复

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


当然,以下是如何在Flutter项目中使用git_stamp插件来进行版本控制的示例代码。git_stamp插件可以帮助你在构建时自动获取Git信息,并将其嵌入到你的应用中。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  # 其他依赖项...
  git_stamp: ^x.y.z  # 替换为最新版本号

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

2. 初始化GitStamp

在你的Flutter项目中,创建一个新的Dart文件,比如git_info.dart,用于初始化GitStamp并获取Git信息。

// git_info.dart
import 'package:flutter/material.dart';
import 'package:git_stamp/git_stamp.dart';

Future<Map<String, String>> getGitInfo() async {
  // 初始化GitStamp
  final gitStamp = GitStamp();
  
  // 获取Git信息
  final info = await gitStamp.getStamp();
  
  return info;
}

3. 使用Git信息

接下来,你可以在你的应用中使用这些Git信息。例如,在一个简单的Flutter应用中,你可以将这些信息展示在一个Text组件中。

// main.dart
import 'package:flutter/material.dart';
import 'git_info.dart';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  Map<String, String>? gitInfo;

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

  Future<void> _loadGitInfo() async {
    final info = await getGitInfo();
    setState(() {
      gitInfo = info;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GitStamp Demo'),
      ),
      body: Center(
        child: gitInfo == null
            ? CircularProgressIndicator()
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('Git Commit Hash: ${gitInfo?['commitHash']}'),
                  Text('Git Branch: ${gitInfo?['branch']}'),
                  Text('Git Author: ${gitInfo?['author']}'),
                  Text('Git Message: ${gitInfo?['message']}'),
                  Text('Git Timestamp: ${gitInfo?['timestamp']}'),
                ],
              ),
      ),
    );
  }
}

4. 运行应用

确保你的Git仓库是干净的,并且你已经提交了至少一个更改,然后运行你的Flutter应用:

flutter run

你应该会看到一个界面,显示了Git的提交哈希、分支、作者、提交信息和时间戳等信息。

这样,你就成功地在Flutter项目中使用git_stamp插件来获取和展示Git版本控制信息了。

回到顶部