使用npm运行bash脚本


77

我想尝试使用npm为Web应用程序运行各种构建任务。我知道我可以这样添加一个scripts字段来做到这package.json一点:

"scripts": {
   "build": "some build command"
},

当您使用带有许多选项的更复杂的命令时,这变得笨拙。是否有可能将这些命令移至bash脚本或类似的东西?就像是:

"scripts": {
   "build": "build.sh"
},

在文件npm run build中的哪里执行命令build.sh

通读这篇文章似乎是这样,但是我不清楚我应该在哪里放置build.sh文件或者丢失了什么。


17
不要这样 节点无处不在。巴什没有。无论您在bash中做什么,都可以在node中完成,甚至CLI调用都可以使用包依赖项来完成。需要rm吗?安装rimraf,然后在npm脚本中使用它。mkdir -p?安装mkdirp,然后在npm脚本中使用它。您拥有一种独立平台的通用脚本语言,就不要再假装它为“仅Nix”。命令行是否太复杂?使用任务运行器,例如gruntgulp。保持通用。
Mike'Pomax'Kamermans

1
当你说你说的是什么“甚至CLI调用可以使用软件包的依赖来完成”这个
Mark McKelvy

关闭,但不可以,请阅读我链接到的幻灯片。您可以安装CLI工具(例如grunt,或gulp,或mkdirp等等)附带的节点模块,而无需人们全局安装它们,然后像将它们全局安装在npm脚本中一样调用它们"build": "mkdirp build && less style/index.less > static/css/style.css && webpack"。只要您调用的命令是npm管理的(即在package.json依赖关系列表中),它就可以工作。对于任何“这仅适用于一个OS”命令,请使用通用执行相同功能的节点模块。
Mike'Pomax'Kamermans

10
上面的评论出于很好的原因拒绝了可移植性。但这取决于您的听众。如果是内部项目,则如果您的开发人员使用的是UNIX之类的变体(Linux / Mac等),则完全可以。如果要创建通用库,可能就不行了……使用BASH / SH有明显的好处,您将能够在一行中完成一些工作,而这需要Grunt / Gulp页面,但是,那么可能排除Windows用户,这可能会或可能不会出现问题。
Forbesmyester

2
对于Web应用程序,为什么rimraf比rm -rf好?rimraf一次只能处理一个文件,而无需处理更多软件包。如果Web服务器没有bash,则可以使用del,但如果用户无论如何都使用Node而不是.net进行开发,则它可能也具有bash。即使它是.net,也可能仍然具有某种形式的gitbash或其他形式。
克里斯·伍德

Answers:


127

完全有可能...

"scripts": {
   "build": "./build.sh"
},

另外,请确保在bash文件的顶部放置一个哈希爆炸 #!/usr/bin/env bash

还请确保您具有执行文件的权限

chmod +x ./build.sh

最后,在npm中运行build的命令是

npm run build

2
您可以将其放置在任意位置,只需确保将相对路径放置在package.json中即可,例如"build": ". ./path/to/my/awesome/build/file/build.sh"
eblahm


9
窗户呢?
Lajos Meszaros

9
在Windows上gitbash:'.' is not recognized as an internal or external command, operable program or batch file.请参阅此处以详细说明原因。此外,将sh文件设置为默认情况下可以使用gitbash或任何其他可以运行bash脚本的环境打开,以使其正常工作。
cjsimon

13
在Windows bash中,以下npm脚本为我工作:"name": "bash ./name.sh"
Rashomon

3

更简单:

我通常这样做是一次性的,而且PoC不涉及VCS

package.json
{
    "scripts": {
        "ship": "rsync -avz deployable/* <some-server>:/var/www/some-site/sub-dir/"
    },
}
...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.