【问题标题】:Issues passing arguments from npm command line to package.json with a bash script使用 bash 脚本将参数从 npm 命令行传递到 package.json 的问题
【发布时间】:2018-09-24 07:42:07
【问题描述】:

这是一个与this thread 略有不同的问题。

我正在寻找将命令行参数传递到我的 package.json 文件和 npm 脚本的最佳方式。我对最终将它传递到脚本中不感兴趣。

有关于如何做到这一点的问题,但没有一个专门解决尝试在 package.json 中使用 bash 函数的问题

我的 npm 脚本是:

"Gocommit": "f() { cd dev; git add -A; git commit -m '$1'; git push;}; f"

我希望能够写作..

npm run Gocommit message

npm run Gocommit -- message

并让它使用我的标志或参数作为提交消息。

但它只是继续使用$1

我哪里做错了?

【问题讨论】:

  • 一目了然,因为package.json 是 JSON 而 NOT 一个 bash 脚本,那么我建议你实际上将你的“函数”放入一个“脚本”中,它可以实际上是用参数执行的。
  • 如果我将我的脚本移动到script.sh 并将我的npm 脚本设为sh script.sh,它仍然只是返回$1 作为我的提交消息。
  • 你实际上已经在这里用“引号”包围了它。删除它们。
  • @NeilLunn 刚刚知道了,谢谢。

标签: node.js bash npm arguments package.json


【解决方案1】:

我做了两个修改来修复。

  1. 将 bash 脚本移至 bash 脚本

Npm 脚本现在是:sh script.sh

2) .sh 脚本或引号中不需要函数换行。

最终脚本为:cd dev; git add -A; git commit -m "$*"; git push;

【讨论】:

  • cd dev || return。否则,即使cd 失败,您仍然可以运行addcommit
  • 另外,git commit -m $1 必须是 git commit -m "$1" 或者提交带有空格的消息(你在提交消息中添加了空格,对吧?)会中断。
  • ...例如,考虑一下您是否运行过npm run Gocommit ignore files matching *.txt。如果没有引号,*.txt 在调用函数之前将替换为当前目录中的文本文件列表。相反,如果你做到了npm run Gocommit "ignore files matching *.txt",那就有争议了。
  • ...同样,仅使用$1 表示消息(并要求用户引用)意味着$2 及以后的版本可用于将来的扩展。
  • 每当操作系统启动一个新程序时,调用约定是int main(int argc, char **argv),所以在shell可以真正启动像npm这样的外部程序之前,原来的命令行已经被解构为一个列表单独的 C 字符串、扩展的 glob 等。引用为 用户的 shell 提供了关于如何进行转换的指令,但是在启动 npm 时,无法判断是否输入了某些内容hello\ world"hello world"'hello world'hello' 'world等,因为它们都变成了同一个数组元素。
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2015-01-29
  • 2018-04-21
相关资源
最近更新 更多