将git提交消息传递给npm脚本并附加到预定义字符串
在NPM项目中,我希望每个构建版本都有一个提交。这将允许我返回到当前的构建版本,修复一个bug,而不必经历新版本的所有QA 我们可以使用如下npm脚本进行提交: package.json 脚本:{ git:git-add.&git-commit-m, } 然后通过运行以下命令调用脚本:将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 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,是的。显然,测试是在构建之后进行的,所以构建本身并不意味着我可以将其识别为测试版本。但我仍然可以将它与其他提交区分开来,希望它能让我非常接近我正在寻找的特定提交。