配置节点npm package.json,以便“npm test”适用于unix和windows

时间:2013-11-16 02:43:27

标签: windows node.js unix npm

我开发了一个node.js npm模块,在Windows下开发。今天我写了一些Mocha测试。经过多次挣扎,似乎npm test工作,package.json必须看起来像这样:(可能还有其他选择???)

"scripts": { "test": "node node_modules/mocha/bin/mocha" }

而不是所有基于Unix的书中的内容,

"scripts": { "test": "./node_modules/.bin/mocha" }

如何将package.json设置为在Windows和Unix上运行?我假设Travis-CI运行Unix,所以,如果我将构建链接到那个,它将会破坏Windows版本。

我找到了一个两年前的帖子,有人要求提供一个功能。那个线程似乎消失了。这SO question似乎很接近,但这并不是我想要的,坦率地说,我无法理解答案。 :-(任何人都可以澄清一下吗?

暂时,我要去

"scripts": {
      "test": "node node_modules/mocha/bin/mocha",
      "testOnUnixUseThis"    : "./node_modules/.bin/mocha (I think)",
      "testOnWindowsUseThis" : "node node_modules/mocha/bin/mocha"
  },

很遗憾,你不能去npm test testOnWindowsUseThisnpm testOnWindowsUseThis。它并没有解决Travis-CI问题。但至少下载该模块的人可以(希望)看到发生了什么。

有更好的想法吗?我是唯一仍在Windows下开发的人吗??? : - )

5 个答案:

答案 0 :(得分:36)

我一直能够npm install -g mochanpm install mocha,然后只需添加

"scripts": {
    "test": "mocha spec"
}

到package.json。这可能会或可能不会在每个环境中工作。我知道,例如,对于线卫,你必须使用bin / mocha。此外,如果你找不到解决方法,请为Unix设置测试脚本,然后添加第二个名为“wintest”的脚本,或者在Windows中执行任何你需要它做的事情。您可以根据需要为脚本命名。默认值(测试,开始等)可与npm [command]一起使用;任何非标准的(如wintest)都可以与npm run-script [command]一起使用,它们仍然可以使用。

关于如何/为何如此有用的一个小故事:

当您全局安装模块时,它可以在PATH上使用(或者等效的Windows)。当您安装项目依赖项时,如果该模块有任何二进制文件,那么这些二进制文件符号链接到node_modules/.bin,当您运行npm run [some-command]时,npm帮助将node_modules/.bin添加到该命令的PATH < / em>的。因此,当全局安装mocha时"test": "mocha spec"使用全局安装的mocha来运行测试。当它是项目依赖项时,它使用node_modules/.bin中的那个。我发现这个问题是npm将node_modules/.bin添加到PATH的前面,因此本地二进制文件总是优先于全局二进制文件。 几乎所有的时间,这就是你想要的,但值得知道它是如何工作的(我最近有一个与此相关的错误)。

编辑:

不确定npm历史记录中的哪一点发生了变化,但npm run <script-name>现在有效(不再需要npm run-script <script-name>)。可能run-script仍然有用。我期待它,但我没有尝试过。

答案 1 :(得分:15)

  

如何将package.json设置为在Windows和Unix上运行?

如果你

  • 使用Windows
  • 不喜欢-g全球安装

......这是一个有效的解决方案

"scripts": {
  "test": "node node_modules/mocha/bin/mocha.js"
},

备注

  • node放在前面不应该有害,并且可以在Windows上提供帮助(.js扩展名不一定注册到nodejus可执行文件,除非你这样设置。可以打开文本编辑器,IDE或者(更糟糕的)Windows脚本主机,Internet Explorer ...)
  • 直接使用脚本可以避免需要全局安装。 (不判断这是不是一个好习惯)
  • 正斜杠帮助在linux下运行(很明显)并在windows下工作(在这种情况下。也避免了Windows陷阱:如果使用了反斜杠,则需要加倍 - 因为如果使用它们,它们被解释为转义后面的字母)。

答案 2 :(得分:10)

不要使用全球解决方案,我建议您遵循Mocha的人say

"scripts": {  
    "test": "node_modules/.bin/mocha -w"
 },

答案 3 :(得分:5)

使用npm i mocha --save-dev

这会将模块保存为开发依赖项,npm将自动设置要在scripts对象中使用的可执行文件。如果您想使用package.json中定义的脚本之外的可执行文件,您也可以全局安装它,但请注意,您最终可能会使用该软件包的不同版本。

如果您只在全球范围内安装,那么其他人如果尝试运行您的测试会感到高兴(使用标准npm test

答案 4 :(得分:1)

6.x之后具有新npm版本的新方法,您无需再以global模式安装mocha。

"scripts": { "test": "npx mocha" }

npx随新的npm安装一起自动安装。它将搜索  mocha中的node_modules/.bin或$ PATH

参考:https://www.npmjs.com/package/npx