npm脚本名称中的冒号:代表什么?

72

试图弄清楚在npm脚本名称中放置冒号的作用。例如:

package.json

"test:ci": "rest of script"

:ci会做什么?运行npm run test:ci失败了。

我真的找不到任何bash语法错误。


1
bash无关。显然这是一个惯例,可能需要更好的解释 - Dan Dascalescu
4个回答

51

我认为这只是一种命名约定,用于分组一组相关的任务。例如,您可能有:

"test:ci": ...
"test:units": ....
"test:integration"...

在这种情况下,它是将一组相关的测试任务分组。

这取决于软件包作者的指定。你可以按照上面回答中所述拆分任务,然后有一个“全局”test命令,将它们组合起来,例如test:ci && test:unit && test:integration,使你能够一次运行或根据需要单独运行它们。

你可以使用npm-run-all (链接)并使用命令npm-run-all test:*,然后它会找到以test:组开头的所有脚本。


4
但是它是如何分组的?它实际上在做什么?有什么好处? - PositiveGuy
1
@PositiveGuy 我已经更新原始答案并附上更多的背景和示例。 - brrwdl
3
没有“以上的答案” :'( - codepleb
这是正确的答案。它只是一个命名约定,除了本帖子解释的内容之外,它并没有做任何其他事情。当你有很多脚本时,使用这样的人类可读组来帮助你,并且通过使用 npm-run-all,你可以运行所有脚本或根据需要运行单个脚本。 - user3376065
预测试在带有冒号的任务上无法正常工作。看起来很愚蠢。 - undefined

15

我通过运行 - "npm run <scriptName>" 解决了这个问题。

在我的package.json文件中,有两个“start scripts”。

start: nodemon server.js

start:elasticsearch: docker run elasticsearch..

通过npm run start:elasticsearch解决了问题。


为什么我可以调用npm test,但要调用我的自定义测试脚本(如testHeadless),我必须调用npm run testHeadless? - JesseBoyd
7
解决了什么问题? - zr0gravity7
@JesseBoyd 这只是 npm 开发人员采用的惯例。这很可能是为了避免用户定义的脚本名称与预定义的 CLI 脚本之间的命名空间冲突(例如,定义一个名为“init”的脚本会在运行 npm init 时导致歧义)。他们已经为某些常见的用户定义脚本添加了快捷方式,但不能对所有脚本进行分类处理。 - zr0gravity7

6
如果使用Yarn包管理器,您可以在名称中使用冒号来从任何工作区调用脚本。
根据如何在工作区之间共享脚本?的yarn文档:
鲜为人知的Yarn功能:带有冒号(build:foo)的任何脚本都可以从任何工作区调用。
另外,根据yarn文档CLI > run
否则,如果指定的名称包含冒号字符,并且项目中的工作区之一恰好包含一个匹配名称的脚本,则将执行此脚本。

如何禁用分享脚本? - Arpit Bhalla

1
有时候我们会给脚本取相同的名字,但是细节上的功能有所不同,但它们作为一个主题是相同的。
 "scripts": {
    "test": "react-scripts test",
    "test:e2e": "node_modules/.bin/cypress open"
  },

这两个test脚本的目的是为了测试项目代码。

当我们需要运行e2e测试时,我们使用脚本npm run test:e2e,当我们需要运行integrationunit测试时,我们运行脚本npm run test


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接