【问题标题】:How to have npm run <script> delegate to child package.json?如何让 npm 运行 <script> 委托给子 package.json?
【发布时间】:2015-06-09 18:36:03
【问题描述】:

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

例子在这里:

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

原因是顶层是一个 Rails 应用程序,我将所有节点工具放在一个名为 client 的目录下,并带有它自己的 package.json 文件。顶级package.json 文件是节点构建包运行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"
  }
}

【问题讨论】:

    标签: node.js npm package.json


    【解决方案1】:

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

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

    客户端有一个package.jsonnpm run build 命令用于构建客户端代码。

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

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

    这可能有助于将子项目分解为具有自己的 git 存储库的单独模块并通过安装后脚本构建它。在这种情况下,当在父项目上运行npm install 时,子项目将有机会构建自己。

    【讨论】:

      【解决方案2】:

      您可以编写一个批处理文件来放置gulp-command。然后你必须检查错误状态。可能是这样的:

      @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"
      

      在我的项目上做了同样的事情......

      编辑:对于所有脚本....您可以创建一个将脚本名称作为参数的批处理文件。该脚本的作用与上面相同,但它应该适用于每个命令。

      注意:您必须使用 start path/to/batchfile.bat gulp 之类的东西,而不是 npm run gulp。错误处理不适用于 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
      

      【讨论】:

        猜你喜欢
        • 2018-08-18
        • 1970-01-01
        • 2018-05-26
        • 2015-09-02
        • 2020-02-06
        • 2019-01-23
        • 1970-01-01
        • 2020-08-25
        • 1970-01-01
        相关资源
        最近更新 更多