将git提交消息传递给npm脚本并附加到预定义字符串

将git提交消息传递给npm脚本并附加到预定义字符串,npm,command-line,npm-scripts,Npm,Command Line,Npm Scripts,在NPM项目中,我希望每个构建版本都有一个提交。这将允许我返回到当前的构建版本,修复一个bug,而不必经历新版本的所有QA 我们可以使用如下npm脚本进行提交: package.json 脚本:{ git:git-add.&git-commit-m, } 然后通过运行以下命令调用脚本: npm run git -- "Message of the commit" 我想在npm运行构建之后自动运行它。为此,我们可以创建一个新命令 package.json 脚本:{ buildAndCommit:

在NPM项目中,我希望每个构建版本都有一个提交。这将允许我返回到当前的构建版本,修复一个bug,而不必经历新版本的所有QA

我们可以使用如下npm脚本进行提交:

package.json

脚本:{ git:git-add.&git-commit-m, } 然后通过运行以下命令调用脚本:

npm run git -- "Message of the commit"
我想在npm运行构建之后自动运行它。为此,我们可以创建一个新命令

package.json

脚本:{ buildAndCommit:npm运行build&&git add.&git commit-m, } 可以使用npm run buildAndCommit-commit为新构建运行此操作

剩下的唯一一件事是,我想将此提交标识为可以链接到提交的提交。是否可以使用BUILD-自动启动消息,并将命令行中传递的唯一消息添加到该消息中?比如:

package.json

脚本:{ buildAndCommit:npm运行build&&git add.&&git commit-'build'+$uniquemessagefrom命令行`, } 如果无法在package.json中模板化字符串,如何使用命令行脚本实现它?Powershell是我的命令行工具

在*nix平台上运行 在*nix平台上,npm默认使用sh来执行npm脚本。在这个场景中,您可以简单地使用一个参数,并使用$1引用通过CLI传递的git message参数

您的npm脚本将重新定义如下:

脚本:{ 构建:。。。, buildAndCommit:func{npm运行build&git add.&git commit-m\build-$1\;};func } 跨平台 不幸的是,通过Windows Powershell,解决方案并没有那么简单和简洁

使用Powershell时,npm默认使用cmd来执行npm脚本。同样,npm默认情况下也通过其他Windows控制台(如命令提示符)使用cmd

实现需求的一种方法是通过npm脚本调用node.js。下面提供了两种基本相同的方法。在您的案例中,任何一个都将通过Powershell成功跨平台运行

方法A-使用单独的node.js脚本

创建以下node.js脚本。让我们将文件命名为script.js,并将其保存在项目目录的根目录中,即package.json所在的同一目录中

script.js

const execSync=需要“子进程”。execSync; const mssg='BUILD-'+process.argv[2]; execSync'npm运行构建和git添加git commit-m\'+mssg+'\',{stdio:[0,1,2]}; 解释

node.js内置函数捕获通过CLI提供的索引2处的参数,即git提交消息。git提交消息与子字符串BUILD连接在一起,以形成所需的提交消息。结果字符串被分配给变量mssg

然后,我们利用node.js内置来执行给定的npm脚本。如您所见,mssg变量的值用作git提交消息

该选项用于确保在父进程和子进程之间建立正确的管道配置,即stdin、stdout、“stderr”

定义名为buildAndCommit的npm脚本,如下所示:

package.json

脚本:{ 构建:。。。, buildAndCommit:节点脚本 } 上面的节点调用script.js

方法B-在npm脚本中内联node.js脚本

或者,可以在npm脚本中内联提供前面提到的node.js脚本,即script.js,从而避免使用单独的.js文件

package.json

脚本:{ 构建:。。。, buildAndCommit:node-e\const mssg='BUILD-'+process.argv[1];需要'child\u process'。execSync'npm运行BUILD&&git add.&git commit-m\\\\'+mssg+'\\\\',{stdio:[0,1,2]}\ } 这使用了方法A中的相同代码,尽管稍微进行了重构。显著的区别是:

nodejs命令行选项用于评估内联JavaScript。 这次process.argv将在参数数组的索引1处捕获参数,即git提交消息。 双引号的额外转义是必要的,即\\\ 运行npm脚本

使用方法A或方法B,根据需要通过CLI运行命令:例如:

$ npm run buildAndCommit -- "commit for a new build"
这将生成以下git提交消息:

构建-提交新构建

在*nix平台上运行 在*nix平台上,npm默认使用sh来执行npm脚本。在这个场景中,您可以简单地使用一个参数,并使用$1引用通过CLI传递的git message参数

您的npm脚本将重新定义如下:

脚本:{ 构建:。。。, buildAndCommit:func{npm运行build&git add.&git commit-m\build-$1\;};func } 跨平台 不幸的是,通过Windows Powershell,解决方案并没有那么简单和简洁

使用Pow时 ershell npm默认使用cmd来执行npm脚本。同样,npm默认情况下也通过其他Windows控制台(如命令提示符)使用cmd

实现需求的一种方法是通过npm脚本调用node.js。下面提供了两种基本相同的方法。在您的案例中,任何一个都将通过Powershell成功跨平台运行

方法A-使用单独的node.js脚本

创建以下node.js脚本。让我们将文件命名为script.js,并将其保存在项目目录的根目录中,即package.json所在的同一目录中

script.js

const execSync=需要“子进程”。execSync; const mssg='BUILD-'+process.argv[2]; execSync'npm运行构建和git添加git commit-m\'+mssg+'\',{stdio:[0,1,2]}; 解释

node.js内置函数捕获通过CLI提供的索引2处的参数,即git提交消息。git提交消息与子字符串BUILD连接在一起,以形成所需的提交消息。结果字符串被分配给变量mssg

然后,我们利用node.js内置来执行给定的npm脚本。如您所见,mssg变量的值用作git提交消息

该选项用于确保在父进程和子进程之间建立正确的管道配置,即stdin、stdout、“stderr”

定义名为buildAndCommit的npm脚本,如下所示:

package.json

脚本:{ 构建:。。。, buildAndCommit:节点脚本 } 上面的节点调用script.js

方法B-在npm脚本中内联node.js脚本

或者,可以在npm脚本中内联提供前面提到的node.js脚本,即script.js,从而避免使用单独的.js文件

package.json

脚本:{ 构建:。。。, buildAndCommit:node-e\const mssg='BUILD-'+process.argv[1];需要'child\u process'。execSync'npm运行BUILD&&git add.&git commit-m\\\\'+mssg+'\\\\',{stdio:[0,1,2]}\ } 这使用了方法A中的相同代码,尽管稍微进行了重构。显著的区别是:

nodejs命令行选项用于评估内联JavaScript。 这次process.argv将在参数数组的索引1处捕获参数,即git提交消息。 双引号的额外转义是必要的,即\\\ 运行npm脚本

使用方法A或方法B,根据需要通过CLI运行命令:例如:

$ npm run buildAndCommit -- "commit for a new build"
这将生成以下git提交消息:

构建-提交新构建


使用Powershell,为新版本运行npm run buildAndCommit-BUILD-commit可能更简单,即包括BUILD-prefix。不过,如果在*nix上运行的解决方案相当琐碎的话,那么请不要将BUILD-part包含在传递给npm run buildAndCommit的参数中?@RobC,谢谢!这真的很有帮助。这背后的想法是构建过程与版本控制过程是分开的。每个新版本都需要一些QA。我尝试在一个单独的分支中创建新功能。但有时我会更改主分支上的代码。然后,如果实时版本需要即时补丁,则无法等到下一个版本发布。我想返回到经过测试的稳定版本,只需更改必要的代码即可。制造snese?那么,构建前缀是否是识别上次测试的稳定构建的一种方法?@RobC,是的。显然,测试是在构建之后进行的,所以构建本身并不意味着我可以将其识别为测试版本。但我仍然可以将其与其他提交区分开来,希望它能使我非常接近我正在寻找的特定提交。使用Powershell,为新的生成运行npm run buildAndCommit-BUILD-commit可能更简单,即包括生成前缀。不过,如果在*nix上运行的解决方案相当琐碎的话,那么请不要将BUILD-part包含在传递给npm run buildAndCommit的参数中?@RobC,谢谢!这真的很有帮助。这背后的想法是构建过程与版本控制过程是分开的。每个新版本都需要一些QA。我尝试在一个单独的分支中创建新功能。但有时我会更改主分支上的代码。然后,如果实时版本需要即时补丁,则无法等到下一个版本发布。我想返回到经过测试的稳定版本,只需更改必要的代码即可。制造snese?那么,构建前缀是否是识别上次测试的稳定构建的一种方法?@RobC,是的。显然,测试是在构建之后进行的,所以构建本身并不意味着我可以将其识别为测试版本。但我仍然可以将它与其他提交区分开来,希望它能让我非常接近我正在寻找的特定提交。