用npm运行bash脚本

132

我想尝试使用npm来运行我的各种构建任务,以用于网页应用程序。我知道我可以通过在package.json中添加scripts字段来实现:

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

当您拥有具有大量选项的更复杂命令时,使用起来会变得笨拙。 是否可以将这些命令移动到bash脚本或类似的东西中? 像这样:

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

npm run build会执行build.sh文件中的命令,参考这篇文章,看起来是这样的,但我不确定该在哪里放置我的build.sh文件,或者是否有什么遗漏。


32
不要这样做。Node可以在任何地方运行,而Bash不行。无论你在Bash中做什么,都可以用Node来做,并且即使是CLI调用也可以使用软件包依赖项来完成。需要rm吗?安装rimraf,然后在npm脚本中使用它。mkdir -p?安装mkdirp,然后在npm脚本中使用它。你拥有一种跨平台的通用脚本语言,不要再假装它只适用于类Unix系统。命令行太复杂了吗?使用像gruntgulp这样的任务运行器。保持通用。 - Mike 'Pomax' Kamermans
1
当你说“甚至可以使用包依赖来进行CLI调用”时,你是指像这样的东西吗? - Mark McKelvy
22
以上评论的内容之所以说不行,有一个很好的理由,那就是可移植性。但这取决于你的受众。如果这是一个内部项目,如果你的开发人员使用类UNIX的变体(如Linux/Mac等),那么完全没有问题。如果你正在创建一个通用库,那么可能就不行了... 使用BASH/SH有明显的好处,可以用一行代码实现需要Grunt/Gulp数页才能实现的某些功能,但同时,你可能会排除Windows用户,这可能是个问题,也可能不是。 - Forbesmyester
4
为什么在 Web 应用中 rimraf 比 rm -rf 命令更好?rimraf 一次只能处理一个文件,且需要额外的包,但这些包并非必需品。如果 web 服务器不支持 bash,可以使用 del 命令,但如果用户开发 node 而非 .net 等其他语言,则大概率已经安装了 bash。即使是 .net,也可能使用 gitbash 或其他相似的工具。 - Chris Wood
6
@Mike'Pomax'Kamermans,认为每个Node应用程序都必须是可移植的,仅仅因为Node是可移植的,这种想法是错误的。 - skalee
显示剩余3条评论
5个回答

214

完全有可能...

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

此外,请确保在您的bash文件顶部放置一个hash bang:#!/usr/bin/env bash

还要确保您具有执行该文件的权限。

chmod +x ./build.sh

最后,运行npm中的构建命令是

npm run build

4
你可以把它放在任何地方,但请确保在 package.json 文件中放置正确的相对路径。例如:"build": ". ./path/to/my/awesome/build/file/build.sh"。 - eblahm
2
它在当前 shell 中运行脚本。http://superuser.com/questions/46139/what-does-source-do - eblahm
14
Windows是什么? - Lajos Mészáros
23
在Windows gitbash中, '.' is not recognized as an internal or external command, operable program or batch file. 这里有详细的解释。另外,将sh文件默认打开为gitbash或其他能运行bash脚本的环境也可使其正常工作。 - cjsimon
33
在Windows bash中,以下npm脚本适用于我: "name": "bash ./name.sh" - Rashomon
显示剩余7条评论

31

如果您不想烦恼于授予权限以及脚本执行的环境,并且您所使用的是例如sh,那么您可以这样做:

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


9

更简单的方法:

对于不涉及版本控制系统的单次任务和概念验证,我通常采用此方法。

{
    "scripts": {
        "ship": "rsync -avz deployable/* <some-server>:/var/www/some-site/sub-dir/"
    },
}
...

5
  • 只需在文件名.sh之前添加'bash'关键字

    "scripts": { "build": "bash ./file_name.sh" }

  • 然后在终端上运行"npm run build"


添加 bash 关键字的好处是什么? - Paul Razvan Berg
1
通过这样做,您明确告诉它使用bash终端来执行命令。这样,您的可执行文件不需要获得可执行权限,因为bash已经处理了这个问题。 - DutchJelly

1

如果有人看到这个,并且正在使用Docker来创建该应用程序的镜像。

关于:

但是我不清楚我应该把build.sh文件放在哪里。

无论您决定将build.sh文件放在哪里,确保它包含在Dockerfile镜像输出中,即该文件的路径位于Dockerfile中的COPY命令之一中。

例如,如果您有类似以下内容的代码:

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

那么你的Dockerfile应该有一个类似于COPY命令的指令:

COPY scripts/build.sh scripts/

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