将 git 信息添加到 create-react-app

IT技术 node.js reactjs git create-react-app
2021-05-14 08:49:09

在开发中,我希望能够从 Web 上查看构建信息(git commit hash、作者、上次提交消息等)。我努力了:

  • 使用 child_process 执行 git 命令行,并读取结果(由于浏览器环境不起作用)
  • 期间生成 buildInfo.txt 文件npm build并从文件中读取(不起作用,因为 fs 在浏览器环境中也不可用)
  • 使用外部库,例如“git-rev”

唯一要做的似乎是做npm run eject和应用https://www.npmjs.com/package/git-revision-webpack-plugin,但我真的不想退出 create-react-app。有人有任何想法吗?

4个回答

稍微切线(不需要弹出并在开发中工作),这可能有助于其他人通过添加以下内容将他们当前的 git commit SHA 作为元标记添加到他们的 index.html 中:

REACT_APP_GIT_SHA=`git rev-parse --short HEAD`

到 package.json 中的构建脚本,然后添加(注意它必须以 REACT_APP... 开头,否则将被忽略):

<meta name="ui-version" content="%REACT_APP_GIT_SHA%">

进入公共文件夹中的 index.html。

在react组件中,这样做:

<Component>{process.env.REACT_APP_GIT_SHA}</Component>

受 Yifei Xu 的回应启发,我创建了另一个选项,该选项使用带有 create-react-app 的 es6 module。此选项会创建一个 javascript 文件并将其作为常量导入到构建文件中。虽然将其作为文本文件使其易于更新,但此选项可确保它是打包到 javascript 包中的 js 文件。这个文件的名字是 _git_commit.js

package.json 脚本:

"git-info": "echo export default \"{\\\"logMessage\\\": \\\"$(git log -1 --oneline)\\\"}\"  > src/_git_commit.js",
"precommit": "lint-staged",
"start": "yarn git-info; react-scripts start",
"build": "yarn git-info; react-scripts build",

使用此提交消息的示例组件:

import React from 'react';

/**
 * This is the commit message of the last commit before building or running this project
 * @see ./package.json git-info for how to generate this commit
 */
import GitCommit from './_git_commit';

const VersionComponent = () => (
  <div>
    <h1>Git Log: {GitCommit.logMessage}</h1>
  </div>
);

export default VersionComponent;

请注意,这会自动将您的提交消息放入 javascript 包中,因此请确保没有将安全信息输入到提交消息中。我还将创建的 _git_commit.js 添加到 .gitignore 因此它不会被签入(并创建一个疯狂的 git commit 循环)。

eject在 Create React App 2.0(发行说明之前,没有ing是不可能做到的,它带来了在编译时运行的 Babel 插件宏的自动配置。为了让每个人的工作更简单,我编写了其中一个宏并发布了一个 NPM 包,您可以将其导入以将 git 信息导入您的 React 页面:https : //www.npmjs.com/package/react-git-info

有了它,你可以这样做:

import GitInfo from 'react-git-info/macro';

const gitInfo = GitInfo();

...

render() {
  return (
    <p>{gitInfo.commit.hash}</p>
  );
}

项目README有更多信息。您还可以在此处查看该软件包的现场演示

所以,事实证明没有弹出就无法实现这一点,所以我使用的解决方法是:

1) 在 package.json 中,定义一个脚本 "git-info": "git log -1 --oneline > src/static/gitInfo.txt"

2)npm run git-info为 start 和 build添加

3) 在 config js 文件中(或者当你需要 git 信息时),我有

const data = require('static/gitInfo.txt')
fetch(data).then(result => {
    return result.text()
})