NPM:使package.json在Unix(Mac OSX)和Windows下运行

Zar*_*rin 5 unix windows json node.js

我从在Mac OSX下开发的第三方获得了一些NPM包.他们的构建可以使用package.json中的"scripts"对象拆分为开发或生产.例如:

 "scripts": {
    "build": "NODE_ENV=dev node make.js --build",
    "build-prod": "NODE_ENV=prod node make.js --build",
  }
Run Code Online (Sandbox Code Playgroud)

在Unix下,可以运行"npm run build"或"npm run build-prod"来构建任一目录(当然,make.js中有一些条件语句).当然,它在Windows下不起作用 - 我不得不改变与此类似的命令:

 "scripts": {
    "build": "set NODE_ENV=dev&& node make.js --build",
    "build-prod": "set NODE_ENV=prod&& node make.js --build",
  }
Run Code Online (Sandbox Code Playgroud)

(请注意,重要的是不要在'&&'之前放置空格 - 否则环境变量是在其中创建一个额外的空白区域,这会破坏make.js中的所有比较).

但是,我希望有一些通用的源代码树可以在Unix或Windows下运行而无需编辑.您能否就如何根据操作系统有条件地拆分构建提出一些想法?

Vas*_*liy 7

这个问题很老了,但是对于现在遇到问题的人来说,从版本> = 5.1.0开始的npm支持设置shell来处理脚本。默认情况下,在 Windows 上,npm 在内部使用 cmd.exe 来运行脚本,即使 npm 命令本身是在 git-bash 中输入的。设置 git-bash 为 shell 后,使用 bash 语法的脚本在 Windows 上正常工作:

npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"

这里需要将他的正确路径替换为 git-bash 可执行文件。


ala*_*rev 2

我已经思考了一段时间,但我怀疑是否有任何美学解决方案可以使用这些工具来获得所需的效果。

如果您能够影响 中的更改make.js,我宁愿更改此文件以接受proddev作为参数,例如:node make.js --build=dev。使用默认值,以确保向后兼容性。

仅使用 npm 而不修改make.js,我可以想到只运行另一个 JavaScript 代码,这将更改环境变量,然后调用make.js.

那看起来像:

"build": "node middleman.js"
Run Code Online (Sandbox Code Playgroud)

Middleman.js 文件然后可以使用child_process或其他模块来设置变量并执行node make.js文件。

如果您不想创建额外的文件,则可以使用以下方法将所有 JavaScript 嵌入 package.json 中:

"build": "node -e 'my code'"
Run Code Online (Sandbox Code Playgroud)

请注意,运行“node -e 'process.env[\'NODE_ENV\']=\'dev\' && node make.js”将不起作用,因为process.env在本地进程中设置变量,而不是全局变量(即不导出到系统)。


这不是直接的解决方案,但为了最佳实践,让它以不同的方式工作。