A technique you might use once you start having lots of npm scripts is to use a node package that allows you to define your scripts in an external package-scripts.js file. By pulling out your scripts it can help with organization, enable better comments, provide shortcuts, and more.

Install:

npm i -D p-s

Run:

node_modules/.bin/p-s init

Then if we check package.json file, we found that the scripts from:

  "scripts": {
"start": "node index.js",
"poststart": "npm run build && npm run server",
"pretest": "npm run lint",
"test": "BABEL_ENV=test mocha spec/ --require babel-register",
"cover": "nyc npm t",
"postcover": "rm -rf .nyc_output",
"cover:open": "open coverage/index.html",
"lint": "npm-run-all lint:**",
"lint:js": "eslint --cache --fix ./",
"lint:css": "stylelint '**/*.scss' --syntax scss",
"lint:css:fix": "stylefmt -R src/",
"watch": "npm-run-all --parallel watch:*",
"watch:test": "npm t -- --watch",
"watch:lint": "onchange 'src/**/*.js' 'src/**/*.scss' -- npm run lint",
"build": "npm-run-all build:*",
"prebuild": "rm -rf public/$npm_package_version",
"build:html": "pug --obj data.json src/index.pug --out public/$npm_package_version/",
"build:css": "node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css",
"build:js": "mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js",
"server": "npm-run-all --parallel server:*",
"server:create": "http-server public/$npm_package_version -p $npm_package_config_port",
"server:launch": "open http://localhost:$npm_package_config_port",
"prepush": "npm run lint"
},

to:

  "scripts": {
"start": "nps",
"test": "nps test"
},

We still can run 'npm start' & 'npm t', the actual scripts points to package-script.js file:

module.exports = {
scripts: {
default: 'node index.js',
poststart: 'npm run build && npm run server',
pretest: 'npm run lint',
test: 'BABEL_ENV=test mocha spec/ --require babel-register',
cover: {
default: 'nyc npm t',
open: 'open coverage/index.html'
},
postcover: 'rm -rf .nyc_output',
lint: {
default: 'npm-run-all lint:**',
js: 'eslint --cache --fix ./',
css: {
default: 'stylelint \'**/*.scss\' --syntax scss',
fix: 'stylefmt -R src/'
}
},
watch: {
default: 'npm-run-all --parallel watch:*',
test: 'npm t -- --watch',
lint: 'onchange \'src/**/*.js\' \'src/**/*.scss\' -- npm run lint'
},
build: {
default: 'npm-run-all build:*',
html: 'pug --obj data.json src/index.pug --out public/$npm_package_version/',
css: 'node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css',
js: 'mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js'
},
prebuild: 'rm -rf public/$npm_package_version',
server: {
default: 'npm-run-all --parallel server:*',
create: 'http-server public/$npm_package_version -p $npm_package_config_port',
launch: 'open http://localhost:$npm_package_config_port'
},
prepush: 'npm run lint'
}
};

Now there are some problems we need to fix before it can run all the scripts.

1. Add help command:

Now if we run

npm run

/*
start
nps
test
nps test
*/

We can only see two scripts.

But we can run:

npm start -- --help

Then we able to see all the scripts:

For a more convenient way, we can create a help script:

"help": "npm start -- --help"

or just:

"help": "nps --help"

2. We can add "description" to package-scripts.js to make each command more clear why to use.

So for example, I can "test" script in package-scripts.js from:

test: 'BABEL_ENV=test mocha spec/ --require babel-register',

to:

    test: {
script: 'BABEL_ENV=test mocha spec/ --require babel-register',
description: 'Run the mocha tests'
},

Now if we run help command:

test - Run the mocha tests - BABEL_ENV=test mocha spec/ --require babel-register

We can see the description also.

3. There is no 'npm-run-all' package for 'p-s'

For example:

    lint: {
default: 'npm-run-all lint:**',
js: 'eslint --cache --fix ./',
css: {
default: 'stylelint \'**/*.scss\' --syntax scss',
fix: 'stylefmt -R src/'
}
},

We can change to:

    lint: {
default: 'nps lint.js,lint.css,lint.fix',
js: 'eslint --cache --fix ./',
css: {
default: 'stylelint \'**/*.scss\' --syntax scss',
fix: 'stylefmt -R src/'
}
},

Another example:

    watch: {
default: 'npm-run-all --parallel watch:*',
test: 'npm t -- --watch',
lint: 'onchange \'src/**/*.js\' \'src/**/*.scss\' -- npm run lint'
},

'nps' understand '--parallel' flag, so we can change this script to:

    watch: {
default: 'nps watch.test,watch.lint --parallel',
test: 'npm t -- --watch',
lint: 'onchange \'src/**/*.js\' \'src/**/*.scss\' -- npm run lint'
},

4. 'nps' doesn't support 'pre-' or 'post-' scripts.

For the post- scripts: using '&&' 

For example:

    default: 'node index.js',
poststart: 'npm run build && npm run server',

We have poststart, we can change to:

default: 'node index.js && nps build,server',

For the pre- scripts:

For example:

    pretest: 'npm run lint',
test: {
script: 'BABEL_ENV=test mocha spec/ --require babel-register',
description: 'Run the mocha tests'
},

we can change to:

    test: {
default: {
script: 'nps lint,test.run',
description: 'Run the mocha tests'
},
run: 'BABEL_ENV=test mocha spec/ --require babel-register',
},

Example2:

change from:

    cover: {
default: 'nyc npm t',
open: 'open coverage/index.html'
},
postcover: 'rm -rf .nyc_output',

to:

    cover: {
default: 'nyc npm t && nps cover.clean',
open: 'open coverage/index.html',
clean: 'rm -rf .nyc_output',
},

Example3:

From:

    build: {
default: 'nps build.html,build.css,build.js',
html: 'pug --obj data.json src/index.pug --out public/$npm_package_version/',
css: 'node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css',
js: 'mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js'
},
prebuild: 'rm -rf public/$npm_package_version',

to:

    build: {
default: 'nps build.clean,build.html,build.css,build.js',
clean: 'rm -rf public/$npm_package_version',
html: 'pug --obj data.json src/index.pug --out public/$npm_package_version/',
css: 'node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css',
js: 'mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js'
},

Example4:

prepush: 'npm run lint'

Move to package.json file:

"prepush": "nps lint"

So now if you want to run any script, you can do:

npm start lint
npm start build.js

Aslo nps provides shortcut to run script:

npm start build.html

// the same as

npm start b.h

If you install 'p-s' grobally, you can run any command by:

nps lint
nps build

[NPM] Pull out npm scripts into another file with p-s的更多相关文章

  1. NPM 使用及npm升级中问题解决

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...

  2. [转] 合理使用npm version与npm dist-tag详解

    第一步:发布第一个稳定版本 npm publish//1.0.0 第二步:修改文件继续发布第二个版本 git add -A && git commit -m "c" ...

  3. npm link & run npm script

    npm link & run npm script https://blog.csdn.net/juhaotian/article/details/78672390 npm link命令可以将 ...

  4. [转]adb pull Permission denied及no such file错误

    adb pull  Permission denied及no such file错误 http://www.the8m.com/blog/article/javadk/adbpull.html XP系 ...

  5. angular2 学习笔记 ( angular cli & npm version manage npm 版本管理 )

    更新 : 2017-05-05 现在流行 Yarn ! 它是 facebook google 推出的东西. 算是补助 npm 做的不够好的地方. 源码依然是发布去 npm,只是下载接口换掉罢了哦. n ...

  6. 【npm】利用npm安装/删除/发布/更新/撤销发布包

      什么是npm? npm是javascript的包管理工具,是前端模块化下的一个标志性产物 简单地地说,就是通过npm下载模块,复用已有的代码,提高工作效率   1.从社区的角度:把针对某一特定问题 ...

  7. npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script build`?

    跑npm build结果如下: npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script ...

  8. npm汇总:npm命令 + 实用插件

    一.npm常用命令,以便查阅: npm install     //运行npm install可根据package.json的配置自动安装所有依赖包 npm uninstall   //卸载依赖,如n ...

  9. npm 取消代理 npm config delete proxy

    今天在安装electron时设置了代理,发现再npm install 安装别的总是装不上,只好取消代理. npm 取消代理 npm config delete proxy

随机推荐

  1. canvas.toDataURL() gives “Security Error” in IE 11

    http://stackoverflow.com/questions/30101143/canvas-todataurl-gives-security-error-in-ie-11

  2. windows和Linux内存的对齐方式

    一.内存对齐的初步解说 内存对齐能够用一句话来概括: "数据项仅仅能存储在地址是数据项大小的整数倍的内存位置上" 比如int类型占用4个字节,地址仅仅能在0,4,8等位置上. 例1 ...

  3. Python产生随机数组,测试用

    import numpy as np if __name__ == '__main__': a=np.random.randint(0,10,size=[3,3])    print(a) 输出: [ ...

  4. PatentTips - Method for guest operating system integrity validation

    BACKGROUND The embodiments relate to guest operating system integrity validation, and more particula ...

  5. amazeui学习笔记--css(HTML元素5)--表格Table

    amazeui学习笔记--css(HTML元素5)--表格Table 一.总结 1.基本样式:am-table:直接模块名  <table class="am-table"& ...

  6. Undo表空间数据文件损坏

       UNDO表空间数据文件和system表空间数据文件都是数据库的关键数据文件,如果损坏会导致sql执行失败,用户无法登录,甚至实例崩溃等.同样恢复UNDO表空间数据文件也必须在数据库mount状态 ...

  7. 微服务实战(四):服务发现的可行方案以及实践案例 - DockOne.io

    原文:微服务实战(四):服务发现的可行方案以及实践案例 - DockOne.io 这是关于使用微服务架构创建应用系列的第四篇文章.第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点.第二和第三 ...

  8. 微服务实战(二):使用API Gateway - DockOne.io

    原文:微服务实战(二):使用API Gateway - DockOne.io [编者的话]本系列的第一篇介绍了微服务架构模式.它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用 ...

  9. 第一个hello word 驱动载入失败--------

    今天尝试自己载入第一个驱动模块,依据惯例hello word 然后失败了,如今说明我的操作过程.请个位看看. 首先我的内核版本号: 模块代码与MAKEFILE #include<linux/in ...

  10. [Angular] AuthService and AngularFire integration

    Config AngularFire, we need database and auth module from firebase. import {NgModule} from '@angular ...