代码之家  ›  专栏  ›  技术社区  ›  opensas

节点:如何避免安装全局包

  •  0
  • opensas  · 技术社区  · 7 年前

    我正在寻找一种模式,以避免在使用node时需要全局软件包,我希望安装所有我需要的东西 npm install npm run xxx ,没有安装任何全局程序包。

    例如,我已将jest配置为运行测试。

    这些是我的包中的依赖项。json:

    [...]
    },
    "author": "",
    "license": "ISC",
    "dependencies": {
      "@types/express": "^4.16.1",
      "@types/node": "^11.10.5",
      "express": "^4.16.4",
      "ts-node-dev": "^1.0.0-pre.32",
      "typescript": "^3.3.3333"
    },
    "devDependencies": {
      "@types/jest": "^24.0.9",
      "@types/supertest": "^2.0.7",
      "jest": "^24.3.1",
      "nodemon": "^1.18.10",
      "supertest": "^4.0.0",
      "ts-jest": "^24.0.0"
    }
    [...]
    

    以下是我配置的一些脚本:

    [...]
    "scripts": {
      "test": "jest --coverage",
      "tsc": "tsc",
      "watch": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts"
    },
    [...]
    

    但当我发布 npm run test 我得到这个错误:

    $ npm run test
    > ci-test@0.0.1 test /home/sas/devel/apps/vue/ci-test
    > jest --coverage
    sh: 1: jest: not found
    npm ERR! file sh
    [...]
    

    如果我使用 npm install -g jest 一切正常,但这正是我试图避免的。

    我的一些假设可能是错误的:

    • 运行脚本时,节点首先在节点_modules/中查找命令。bin(以便使用本地安装的软件包)

    • npm安装 每个命令行命令都安装到节点_modules/。箱子

    $ ls node_modules/.bin/
    acorn  cdl        esgenerate  esvalidate            is-ci  json5    loose-envify  mime    nodetouch  parser  semver      sshpk-sign    strip-indent  watch
    atob   escodegen  esparse     import-local-fixture  jsesc  js-yaml  marked        mkdirp  nopt       rc      sshpk-conv  sshpk-verify  uglifyjs
    

    另一方面,作为一种解决办法,以下措施似乎有效:

    "scripts": {
      "test": "npx jest --coverage",
    

    但每次我运行时,npx安装jest需要10秒以上的时间

    那么,实现这一目标的正确方法是什么?O我如何告诉npm将jest安装到节点\ U模块/。bin并在脚本中引用它时使用它?

    0 回复  |  直到 7 年前
        1
  •  3
  •   opensas    7 年前

    看起来比预期的要容易,我只需要发布:

    npm install --only=dev
    

    似乎默认情况下npm不会安装开发依赖项


    npm install 似乎还安装了devdependences,以及节点_modules/中的jest。开玩笑。它似乎是在假设我处于生产模式。


    我学到的另一个避免安装全局依赖项的技巧是使用--save dev来安装它,然后添加一个脚本来运行它 npm run

    npm install jest --save-dev
    

    然后将以下内容添加到包中。json

    scripts: {
      "jest": "jest"
    }
    

    然后,您可以使用 npm run jest 。要从命令行传递参数,必须在参数前添加“---”,如下所示: npm run jest -- --coverage npx jest --coverage ,如果已安装,npx将使用节点_modules/中的jest。箱子(支票 this 更多信息)

    顺便说一句,这个 answer 对一个类似的问题可能是有用的