如何让npm run <script>委托给child package.json?

我有两个package.json文件的级别。

例如:

https://github.com/justin808/react-webpack-rails-tutorial

原因是最高层是一个Rails应用程序,我把所有的节点工具放在一个名为client的目录下,并有它自己的package.json文件。 顶层package.json文件是一个方便的工具,也是一个钩子节点buildpack来运行npm install脚本。

我有一个转发gulp命令的例子。 任何方式来一般地转发从顶级package.json找不到任何东西到孩子?

顶级package.json

 { "name": "react-webpack-rails-tutorial", "version": "1.1.1", "description": "Code from the React Webpack tutorial.", "main": "server.js", "engines": { "node": "0.10.32" }, "scripts": { "postinstall": "cd ./client && npm install", "gulp": "cd ./client && npm run gulp" }, "repository": { "type": "git", "url": "https://github.com/justin808/react-webpack-rails-tutorial.git" }, "keywords": [ "react", "tutorial", "comment", "example" ], "author": "justin808", "license": "MIT", "bugs": { "url": "https://github.com/justin808/react-webpack-rails-tutorial/issues" }, "homepage": "https://github.com/justin808/react-webpack-rails-tutorial" } 

子目录package.json

 { "name": "react-webpack-rails-tutorial", "version": "1.1.0", "description": "Code from the React Webpack tutorial.", "main": "server.js", "engines": { "node": "0.10.32" }, "repository": { "type": "git", "url": "https://github.com/justin808/react-webpack-rails-tutorial.git" }, "keywords": [ "react", "tutorial", "comment", "example" ], "author": "justin808", "license": "MIT", "bugs": { "url": "https://github.com/justin808/react-webpack-rails-tutorial/issues" }, "homepage": "https://github.com/justin808/react-webpack-rails-tutorial", "dependencies": { "babel-core": "^5.0.8", "babel-loader": "^5.0.0", "body-parser": "^1.12.2", "es5-shim": "^4.1.0", "imports-loader": "^0.6.3", "jquery": "^2.1.3", "loader-utils": "^0.2.6", "marked": "^0.3.3", "react": "^0.13.1", "react-bootstrap": "^0.20.1", "sleep": "^2.0.0", "webpack": "^1.7.3" }, "devDependencies": { "babel-eslint": "^2.0.2", "bootstrap-sass": "^3.3.4", "bootstrap-sass-loader": "^1.0.3", "css-loader": "^0.9.1", "eslint": "^0.18.0", "eslint-plugin-react": "^2.0.2", "expose-loader": "^0.6.0", "express": "^4.12.3", "file-loader": "^0.8.1", "gulp": "^3.8.11", "gulp-eslint": "^0.8.0", "node-sass": "^2.1.1", "react-hot-loader": "^1.2.4", "sass-loader": "^0.6.0", "style-loader": "^0.9.0", "url-loader": "^0.5.5", "webpack-dev-server": "^1.8.0" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node server.js", "gulp": "gulp" } } 

您可以使用npm run脚本来简化事务(请参阅npm-scripts )。 在父类package.json

  "scripts": { ... "client-build": "cd client && npm run build" } 

客户端使用npm run build命令创build客户端代码的package.json

然后调用npm run client-build作为其他任务的shell命令的一部分。 例如:

  "scripts": { "start": "npm run client-build && gulp some-task", ... } 

这可能有助于将子项目拆分为具有自己的git仓库的独立模块,并通过后安装脚本构build。 在这种情况下,在父项目上运行npm install时,孩子将有机会自行构build。

你可以写一个batch file,你把gulp命令。 那么你必须检查errorstate。 这可能是这样的:

 @echo off :RUN_GULP echo Running Gulp... gulp goto END :END if %ERRORLEVEL% neq 0 goto PROCESS_ERROR exit :PROCESS_ERROR cd ./client gulp exit; 

那么你只需要在你的package.json中调用脚本就可以了:

 "gulp": "call ./path/to/batfile.bat" 

我的项目也一样…

编辑:对于所有脚本….您可以创build一个batch file,将脚本名称作为参数。 脚本也是如上所述,但它应该适用于每个命令。

注意:你必须使用类似start path/to/batchfile.bat gulp而不是npm run gulp start path/to/batchfile.bat gulp 。 error handling不适用于npm错误!

这可能是这样的:

 @echo off :: Check if script is defined set _script=%1 if "%_script%"=="" goto NO_SCRIPT_DEFINED :START_APP npm run %_script% goto END :NO_SCRIPT_DEFINED echo ERROR: script was not defined pause exit :END if %ERRORLEVEL% neq 0 goto NO_PARENT_SCRIPT exit :NO_PARENT_SCRIPT echo searching in ./client ... cd ./client npm run %_script% exit