有没有更好的方法来构build我的NPM脚本,使其更具可读性?

我已经开始依靠NPM脚本作为我的testing过程的主要工具。

正如我写了更多的NPM脚本,顺序和结构一目了然越来越难读。

以下是我目前的脚本:

{ "scripts": { "clean": "rm -rf report/*", "report": "rm -rf report/; mkdir report", "tests:mocha": "mocha test/spec/", "all-tests:mocha": "npm run tests:mocha -- --recursive", "all-tests:json": "npm run all-tests:mocha -- --reporter json", "all-tests:jsonReport": "npm run all-tests:json > report/all-tests.json", "all-admin:mocha": "mocha test/spec/admin.production.io/", "all-admin-all:mocha": "npm run all-admin:mocha -- --recursive", "all-admin:json": "npm run all-admin:mocha -- --reporter json", "all-admin:jsonReport": "npm run all-admin:json > report/all-tests.json", "google:mocha": "mocha test/spec/googleTest.js", "google:spec": "npm run google:mocha -- --reporter spec --slow 0", "google:json": "npm run google:mocha -- --reporter json", "google:jsonReport": "npm run google:json > report/google-test.json", "usersAll:mocha": "mocha test/spec/admin.production.io/dashboard/users/*.js", "usersAll:spec": "npm run usersAll:mocha -- --reporter spec --slow 0", "usersAll:json": "npm run usersAll:mocha -- --reporter json", "usersAll:jsonReport": "npm run usersAll:jsonReport > report/admin-users-dashboard-all.json", "orgsAll:mocha": "mocha test/spec/admin.production.io/dashboard/organizations/*.js", "orgsAll:spec": "npm run orgsAll:mocha -- --reporter spec --slow 0", "orgsAll:json": "npm run orgsAll:mocha -- --reporter json", "orgsAll:jsonReport": "npm run orgsAll:json > report/admin-orgs-dashboard-all.json", "users-orgs:mocha": "npm run users:spec; npm run orgs:spec", "users-orgs-report": "npm run users:jsonReport; npm run orgs:jsonReport", "pos-users:mocha": "mocha test/spec/admin.production.io/dashboard/users/positiveUserTest.js", "pos-users:spec": "npm run pos-users:mocha -- --reporter spec --slow 0", "pos-users:json": "npm run pos-users:mocha -- --reporter json", "pos-users:jsonReport": "npm run pos-users:json > report/admin-users-dashboard-positive.json", "pos-orgs:mocha": "mocha test/spec/admin.production.io/dashboard/organizations/positiveOrgsTests.js", "pos-orgs:spec": "npm run pos-orgs:mocha -- --reporter spec --slow 0", "pos-orgs:json": "npm run pos-orgs:mocha -- --reporter json", "pos-orgs:jsonReport": "npm run pos-orgs:json > report/admin-users-dashboard-positive.json", "alice-la:mocha": "mocha test/spec/admin.local.us/dashboard/alice/*.js", "alice-la:jsonReport": "npm run alice-la:mocha -- --reporter json -- > report/local-admin-dashboard-alice-all-tests.json", "a2361p-l:mocha": "mocha test/spec/admin.local.us/dashboard/alice/2361-p.js", "a2361p-l:spec": "npm run a2361p-l:mocha -- --reporter spec --slow 0", "a2361p-l:json": "npm run a2361p-l:mocha -- --reporter json", "a2361p-l:jsonReport": "npm run a2361p-l:json > report/a2361p-l.json", "a2361pf-l:mocha": "mocha test/spec/admin.local.us/dashboard/alice/2361-pf.js", "a2361pf-l:spec": "npm run a2361pf-l:mocha -- --reporter spec --slow 0", "a2361pf-l:json": "npm run a2361pf-l:mocha -- --reporter json", "a2361pf-l:jsonReport": "npm run a2361pf-l:json > report/a2361pf-l.json", "alice-pa:mocha": "mocha test/spec/admin.production.io/dashboard/alice/*.js", "alice-pa:jsonReport": "npm run alice-pa:mocha -- --reporter json -- > report/production-admin-dashboard-alice-all-tests.json", "a2361p-p:mocha": "mocha test/spec/admin.production.io/dashboard/alice/2361-p.js", "a2361p-p:spec": "npm run a2361p-p:mocha -- --reporter spec --slow 0", "a2361p-p:json": "npm run a2361p-p:mocha -- --reporter json", "a2361p-p:jsonReport": "npm run a2361p-p:json > report/a2361p-p.json", "a2361pf-p:mocha": "mocha test/spec/admin.production.io/dashboard/alice/2361-pf.js", "a2361pf-p:spec": "npm run a2361pf-p:mocha -- --reporter spec --slow 0", "a2361pf-p:json": "npm run a2361pf-p:mocha -- --reporter json", "a2361pf-p:jsonReport": "npm run a2361pf-p:json > report/a2361pf-p.json", "a2361:all": "npm run clean; npm run a2361p-l:mocha; npm run a2361p-l:spec; npm run a2361p-l:json; npm run a2361p-l:jsonReport; npm run a2361pf-l:mocha; npm run a2361pf-l:spec; npm run a2361pf-l:json; npm run a2361pf-l:jsonReport; npm run a2361p-p:mocha; npm run a2361p-p:spec; npm run a2361p-p:json; npm run a2361p-p:jsonReport; npm run a2361pf-p:mocha; npm run a2361pf-p:spec; npm run a2361pf-p:json; npm run a2361pf-p:jsonReport", "test": "mocha" } 

这只是大约8个testing左右。 我计划编写脚本来输出报告给junit格式,而且已经开始看起来像眼睛疲劳了。

我怎样才能构build我的npm脚本更可读?

编辑:select这个作为现在最好的答案,直到另一个解决scheme发布。

作为一个便宜的技巧,我把空的testing脚本作为头部,然后简单地缩进它下面的正确脚本。 不是一个完全充分的方法,但总比没有缩进好。

警告 :运行空脚本将导致错误。

 { "utils": "", "clean": "rm -rf report/*; rm -rf *.xml", "report": "rm -rf report/; mkdir report", "all-tests": "", "tests:mocha": "mocha test/spec/", "at:mocha": "npm run tests:mocha -- --recursive", "at:junit": "npm run at:mocha -- --reporter mocha-junit-reporter", "at:jReport": "MOCHA_FILE=./report/all-tests.xml npm run at:junit", "all-prod-admin-tests": "", "prod-tests:mocha": "mocha test/spec/admin.production.io/", "apa:mocha": "npm run -prod-tests:mocha -- --recursive", "apa:junit": "npm run apa:mocha -- --reporter mocha-junit-reporter", "apa:jReport": "MOCHA_FILE=./report/all-prod-admin-tests.xml npm run apa:junit", "all-local-admin-tests": "", "local-tests:mocha": "mocha test/spec/admin.pclocal.us/", "ala:mocha": "npm run -prod-tests:mocha -- --recursive", "ala:junit": "npm run ala:mocha -- --reporter mocha-junit-reporter", "ala:jReport": "MOCHA_FILE=./report/all-local-admin-tests.xml npm run ala:junit", "google-example": "", "google:mocha": "mocha test/spec/googleTest.js", "google:spec": "npm run google:mocha -- --reporter spec --slow 0", "google:junit": "npm run google:mocha -- --reporter mocha-junit-reporter", "google:jReport": "MOCHA_FILE=./report/google.xml npm run google:junit", "alice-local-admin-dashboard-tests": "", "alda:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/*.js", "alda:junit": "npm run alda:mocha -- --reporter mocha-junit-reporter", "alda:jReport": "MOCHA_FILE=./report/alice-local-admin-dashboard-tests-all.xml npm run alda:junit", "2361-automated-test": "", "local-admin-pass": "", "a2361p-l:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/2361-p.js", "a2361p-l:spec": "npm run a2361p-l:mocha -- --reporter spec --slow 0", "a2361p-l:junit": "npm run a2361p-l:mocha -- --reporter mocha-junit-reporter", "a2361p-l:jReport": "MOCHA_FILE=./report/2361-local-pass.xml npm run a2361p-l:junit", "local-admin-pass-fail": "", "a2361pf-l:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/2361-pf.js", "a2361pf-l:spec": "npm run a2361pf-l:mocha -- --reporter spec --slow 0", "a2361pf-l:junit": "npm run a2361pf-l:mocha -- --reporter mocha-junit-reporter", "a2361pf-l:jReport": "MOCHA_FILE=./report/2361-local-pass-fail.xml npm run a2361pf-l:junit", "alice-production-admin-dashboard-tests": "", "apda:mocha": "mocha test/spec/admin.production.io/dashboard/alice/*.js", "apda:junit": "npm run apda:mocha -- --reporter mocha-junit-reporter", "apda:jReport": "MOCHA_FILE=./report/alice-production-admin-dashboard-tests-all.xml npm run apda:junit", "2361-automated-test": "", "prod-admin-pass": "", "a2361p-p:mocha": "mocha test/spec/admin.production.io/dashboard/alice/2361-p.js", "a2361p-p:spec": "npm run a2361p-p:mocha -- --reporter spec --slow 0", "a2361p-p:junit": "npm run a2361p-p:mocha -- --reporter mocha-junit-reporter", "a2361p-p:jReport": "MOCHA_FILE=./report/2361-prod-pass.xml npm run a2361p-p:junit", "prod-admin-pass-fail": "", "a2361pf-p:mocha": "mocha test/spec/admin.production.io/dashboard/alice/2361-pf.js", "a2361pf-p:spec": "npm run a2361pf-p:mocha -- --reporter spec --slow 0", "a2361pf-p:junit": "npm run a2361pf-p:mocha -- --reporter mocha-junit-reporter", "a2361pf-p:jReport": "MOCHA_FILE=./report/2361-prod-pass-fail.xml npm run a2361pf-p:junit", "test": "mocha" } 

要清理摩卡testing的文件path,可以考虑将它们移动到opts文件。

所以"alda:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/*.js", "alda:mocha": "mocha --opts mocha_opts/alda "alda:mocha": "mocha test/spec/admin.pclocal.us/dashboard/alice/*.js",可以变成"alda:mocha": "mocha --opts mocha_opts/alda其中opts文件命名为alda包含:

 test/spec/admin.pclocal.us/dashboard/alice/*.js --recursive 

当然, mocha_optsopts文件mocha_opts是你想要的。

另外, -R--reporter简写,如果有帮助的话

opts文件可以被命令行参数覆盖,所以你可以重新使用它们。

我使用了Babel,现在在同一个项目中有我的db,client和api服务器。 事情有一点失控。 随着一些shell /节点脚本opts帮助我。

 "scripts": { "test": "npm run client:test && npm run api:test", "knex": "babel-node node_modules/.bin/knex --cwd db", "api:test": "mocha --opts api/__dev__/mocha.unit", "api:cover": "api/__dev__/api-cover.sh", "api:tdd": "npm run -s db:cycle && npm run -s api:test -- -w -R min", "api:start": "babel-node api/server", "api:watch": "nodemon --exec npm run -s api:start", "client:test": "mocha --opts client/__dev__/mocha.unit", "client:tdd": "npm run -s client:test -- -w -R min", "client:cover": "client/__dev__/client-cover.sh", "client:build": "babel-node scripts/client-build.js", "client:watch": "npm run -s client:build -- --watch", "db:make": "npm run knex migrate:make", "db:latest": "npm run -s knex migrate:latest", "db:rollback": "npm run -s knex migrate:rollback", "db:cycle": "npm run -s db:rollback && npm run -s db:latest" } 

让我们承认,json文件不是存储构build任务的好地方(没有注释,没有variables),package.json已经非常混乱。

如果学习bash和make不适合你,你的团队和外部的贡献者,那么咕咕咕咕地避难所可能是合理化你的构build脚本的好方法。 它允许您将构build任务存储在JS文件中,并结合了NPM脚本和gulpfiles的所有优点:简洁性可读性和可重用性。

这是如何简化你的任务:

 const gulp = require('gulp'); const shelter = require('gulp-shelter')(gulp); const testDir = 'test/spec/'; const clean = `rm -rf report/*`; const report = `${clean}; mkdir report`; const testsMocha = `mocha ${testDir}`; const allTestsMocha = `${testsMocha} --recursive`; const allTestsJson = `${allTestsMocha} --reporter json`; const allTestsJsonReport = `${allTestsJson} > report/all-tests`; ... shelter({ 'clean': clean, 'report': report, 'all-tests:mocha': allTestsMocha, 'all-tests:json': allTestsJson, 'all-tests:jsonReport': allTestsJsonReport, ... });