[NPM] Pull out npm scripts into another file with p-s
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的更多相关文章
- NPM 使用及npm升级中问题解决
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...
- [转] 合理使用npm version与npm dist-tag详解
第一步:发布第一个稳定版本 npm publish//1.0.0 第二步:修改文件继续发布第二个版本 git add -A && git commit -m "c" ...
- npm link & run npm script
npm link & run npm script https://blog.csdn.net/juhaotian/article/details/78672390 npm link命令可以将 ...
- [转]adb pull Permission denied及no such file错误
adb pull Permission denied及no such file错误 http://www.the8m.com/blog/article/javadk/adbpull.html XP系 ...
- angular2 学习笔记 ( angular cli & npm version manage npm 版本管理 )
更新 : 2017-05-05 现在流行 Yarn ! 它是 facebook google 推出的东西. 算是补助 npm 做的不够好的地方. 源码依然是发布去 npm,只是下载接口换掉罢了哦. n ...
- 【npm】利用npm安装/删除/发布/更新/撤销发布包
什么是npm? npm是javascript的包管理工具,是前端模块化下的一个标志性产物 简单地地说,就是通过npm下载模块,复用已有的代码,提高工作效率 1.从社区的角度:把针对某一特定问题 ...
- 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 ...
- npm汇总:npm命令 + 实用插件
一.npm常用命令,以便查阅: npm install //运行npm install可根据package.json的配置自动安装所有依赖包 npm uninstall //卸载依赖,如n ...
- npm 取消代理 npm config delete proxy
今天在安装electron时设置了代理,发现再npm install 安装别的总是装不上,只好取消代理. npm 取消代理 npm config delete proxy
随机推荐
- 洛谷 P1054 等价表达式
洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...
- 【习题 7-8 UVA-12107】Digit Puzzle
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大层数.(也即改变的数字个数 然后枚举第一个改哪个数字,第二个改哪个数字.. 一定要注意字典序问题. 每次优先 ...
- shell实例浅谈之三产生随机数七种方法
一.问题 Shell下有时须要使用随机数,在此总结产生随机数的方法.计算机产生的的仅仅是"伪随机数".不会产生绝对的随机数(是一种理想随机数).伪随机数在大量重现时也并不一定保持唯 ...
- 语音识别系统:有免费实用的"语音到文字"的软件么?
自从看了<李开复自传>,就对"语音识别系统"产生了非常深刻的印象. 根据自己的判断,语音识别系统还是非常有用的. 以自己的实际需求来看: 1.中国象棋中的应用. 中国象 ...
- 在设置了android:parentActivityName后,点击子Activity返回键,父Activity总会调用OnDestroy()的解决方式
近期查了非常久这个事情.分享给大家, 原理非常easy,一个Activity在manifet里声明了android:parentActivityName:这时候通过Activity左上角的返回butt ...
- python中数据结构
列表:数组,矩阵 元组 映射:字典 集合
- js里的表格数组某个key去重
如Elemgnt的table绑定的数据要某个key是唯一的 var myarry = [ {name: 'liuyang',age :13}, {name:'jike',age:15}, {name: ...
- Loadrunner--运行场景报Socket descriptor not found错误
今天早上在使用LoadRunner时,报了如下的错误,开始并未看错误以为是录制问题引起,就重新录制了一遍,简单施压看看错误是否还有,结果错误仍然有,如下所示: Error: Socket descri ...
- 【Codeforces Round #301 (Div. 2) B】 School Marks
[链接] 我是链接,点我呀:) [题意] 已知k门成绩. 总共有n门成绩. 让你构造剩下的n-k门成绩,使得这n门成绩的中位数>=y,并且这n门成绩的和要小于等于x. n为奇数 [题解] 首先判 ...
- uvalive 6393(uva 1572) Self-Assembly 拓扑排序
题意: 给出一些正方形,这些正方形的每一条边都有一个标号.这些标号有两种形式:1.一个大写字母+一个加减号(如:A+, B-, A-......), 2.两个0(如:00):这些正方形能够任意翻转和旋 ...