如何在 npm 脚本中编写多行脚本?

我的包 Json 看起来像这样:

{
"name": "project",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"lint": "./node_modules/eslint/bin/eslint.js --format \"./node_modules/eslint-friendly-formatter/index.js\" .",
"build:server": "./node_modules/babel-cli/bin/babel.js . -d dist/server --ignore node_modules,dist,client,public,webpack*"
}
}

正如您所看到的,lintbuild:server命令很难读,因此我想将它们分成多行。

我尝试使用 \,但它会出现以下错误:

npm ERR! Failed to parse json
npm ERR! Unexpected token ' ' at 11:80
npm ERR! :server": "./node_modules/babel-cli/bin/babel.js . -d dist/server \
npm ERR!                                                                   ^

我怎么能这么做?

只是编写另一个 bash 文件,如 build.sh,并使用它在 npm 脚本,如 ./build.sh server

52958 次浏览

You can chain independent tasks.

Here is an example:

"scripts": {
"lint-jshint": "jshint --verbose --show-non-errors ./src/main/js",
"lint-eslint": "eslint ./src/main/js ./src/test/js",
"lint-csslint": "csslint ./src/main/js",


"lint": "npm run -s lint-jshint & npm run -s lint-eslint & npm run -s lint-csslint",


"pretest": "rimraf ./build/reports/tests && mkdirp ./build/reports/tests && npm run -s lint",
"test": "karma start ./src/test/resources/conf/karma.conf.js",
...

Here is a nice blog which I used at that time: https://www.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/

You can't do that.

The following code is in read-json.js which is in package node_modules/npm/node_modules/read-package-json which is used in run-script.js to execute $ npm run-script ~~ or $ npm run ~~ which is its alias.

function scriptpath (file, data, cb) {
if (!data.scripts) return cb(null, data)
var k = Object.keys(data.scripts)
k.forEach(scriptpath_, data.scripts)
cb(null, data)
}


function scriptpath_ (key) {
var s = this[key]
// This is never allowed, and only causes problems
if (typeof s !== 'string') return delete this[key]


var spre = /^(\.[\/\\])?node_modules[\/\\].bin[\\\/]/
if (s.match(spre)) {
this[key] = this[key].replace(spre, '')
}
}

The key in scriptpath_ is like "build:server" in your code.

The this[key] is like "./node_modules/babel-cli/bin/babel.js . -d dist/server --ignore node_modules,dist,client,public,webpack*" in your code.

So, if you write the code which is not string type, in other words, if you don't write the string text in package.json, it will be an error unless you contribute to the package npm/read-package-json.

Another common alternative is to write an npm command that references a local bash script (where you have more power to do what you want).

i.e.

# package.json
{
"name": "project",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"lint": "./node_modules/eslint/bin/eslint.js --format \"./node_modules/eslint-friendly-formatter/index.js\" .",
"build:server": "./build-server.sh"
}
}
# build-server.sh
#!/bin/bash


./node_modules/babel-cli/bin/babel.js . \
-d dist/server \
--ignore \
node_modules,\
dist,\
client,\
public,\
webpack*

NOTE: make sure you give yourself permission to run the file; otherwise you'll run into permission issues

sudo chmod 755 'build-server.sh'

See: Run script on mac prompt "Permission denied"