web-dev-qa-db-fra.com

Comment puis-je écrire des scripts multilignes dans des scripts npm?

Mon package.json ressemble à ceci:

{
  "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*"
  }
}

Comme vous pouvez le voir, les commandes lint et build:server Sont difficiles à lire, donc je veux les diviser en plusieurs lignes.

J'ai essayé d'utiliser \, Mais cela génère des erreurs comme:

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!                                                                   ^

Comment puis-je faire ceci?

Seulement pour écrire un autre fichier bash comme build.sh Et l'utiliser dans des scripts npm comme ./build.sh server?

41
user2331095

Vous ne pouvez pas faire ça.

Le code suivant est dans read-json.js qui est dans le package node_modules/npm/node_modules/read-package-json qui est utilisé dans run-script.js éxécuter $ npm run-script ~~ ou $ npm run ~~ qui est son 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, '')
  }
}

Le key dans scriptpath_ est comme "build:server" dans votre code.

Le this[key] est comme "./node_modules/babel-cli/bin/babel.js . -d dist/server --ignore node_modules,dist,client,public,webpack*" dans votre code.

Donc, si vous écrivez le code qui n'est pas de type string, en d'autres termes, si vous n'écrivez pas le texte string dans package.json, ce sera une erreur sauf si vous contribuez au package npm/read-package-json.

16

Vous pouvez chaîner des tâches indépendantes.

Voici un exemple:

"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",
    ...

Voici un joli blog que j'ai utilisé à l'époque: https://www.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/

72
asa