Node.js 使用与package.json配置不同的npm

Node.js 使用与package.json配置不同的npm,node.js,npm,package.json,npm-install,Node.js,Npm,Package.json,Npm Install,我有一个由package.json驱动的复杂生产环境 问题: 我希望在本地安装一些额外的软件包,关注它们的列表和版本 解决方案(如何到达那里): 指向npm使用另一个配置文件,从git中排除,它将保留我的私有依赖项。使用该文件将包添加到带有npm安装的本地节点_模块。所以实际上我所需要的就是更改npm的配置上下文 我不知道如何指示npm使用不同的配置(比如gulp-gulpfile) 从评论更新开发依赖项不是一条路要走。我使用stuff 90%的其他开发人员不需要安装在他们的node_模块中(事

我有一个由package.json驱动的复杂生产环境

问题: 我希望在本地安装一些额外的软件包,关注它们的列表和版本

解决方案(如何到达那里): 指向npm使用另一个配置文件,从git中排除,它将保留我的私有依赖项。使用该文件将包添加到带有npm安装的本地节点_模块。所以实际上我所需要的就是更改npm的配置上下文

我不知道如何指示npm使用不同的配置(比如gulp-gulpfile)


从评论更新开发依赖项不是一条路要走。我使用stuff 90%的其他开发人员不需要安装在他们的node_模块中(事实上,我可以用一种奇怪的方式打破他们的环境,更新git shared core project wide package.json中的开发依赖项)。

npm
已经提供了一种内置功能来准确处理这一需求。要在开发环境和生产环境中具有不同的依赖关系,可以通过两种不同的方式将依赖关系保存到package.json中

  • 您可以使用
    save
    标志将其保存为普通依赖项(可在开发和生产中使用)。例:

    npm install <package-name> --save`
    
    npm install <package-name> --save-dev
    
  • 在服务器上运行npm install时,如果节点_ENV设置为生产,则不会安装开发依赖项


    更多信息请点击此处:。您还可以使用其他概念,如可选依赖项等。

    您可以使用
    开发依赖项
    而不是使用seprate文件

    使用
    npm install packageName--dev
    安装软件包。该软件包将进入
    package.json的
    devDependencies

    "devDependencies": {
        "chai": "~3.2.0",
        "supertest": "~1.0.1",
        "morgan": "~1.6.1",
        "nodemon": "~1.8.1"
      }
    
    因此,当您在开发环境中安装npm时,所有依赖项都将被安装,但在生产环境中,开发依赖项将被忽略


    希望它能有所帮助:)

    首先,你应该知道,你所尝试的不仅仅是怪异的行为,而且与NodeJS中的许多良好实践和模式背道而驰

    然而,这是可能的,如果做得好,几乎不会给您或其他不同平台的开发人员带来任何麻烦

    您可以在构建流程中使用一些受启发的东西。让我们从概念上将项目分为两个不同的部分:

    • Base:处理项目初始化
    • 内部原始项目
    项目结构:

    - build.js (base build script)
    - package.json (base package)
    - internal/
      - package.template.json (project package template)
      - app.js (your actual project files)
      - [...]  (your actual project files)
    
    起点是在项目根目录中创建一个
    package.json
    文件到Base。此包将仅包含构建内部项目的包文件的依赖项。我强烈建议您使用类似的方法来确保使用ENVs正确完成配置。这里的目标是在运行时编写另一个
    package.json
    文件

    我们还假设在您的环境中有一个环境变量
    USE\u MODULES=“true”
    。您可以在Base项目中使用这一事实来定义要使用build.js文件安装哪些模块。您可以在运行时读取和编辑它。准备好后,将其另存为
    internal/package.json
    。然后,在
    internal/
    目录中运行
    npm install


    build.js

    let pkg = require('./package.template.json');    
    
    if(process.env.USE_WEIRD_MODULES) {
    
        // Install your weird packages        
        pkg.dependencies.some_dev_package = '^v0.2.2';
        pkg.dependencies.another_dev_package = '^v0.2.2';
    
    
    }
    
    // Don't forget to save the package.json in the end
    fs.writeFileSync('./internal/package.json', JSON.stringify(pkg, null, 2), 'utf8');
    
    不要忘记将
    internal/package.json
    文件放在存储库忽略文件(例如:gitinore)中

    为了最大限度地减少项目中这种粗暴更改的影响,您可以在main
    package.json
    中定义
    postinstall
    脚本中的所有构建例程。它将允许在项目根目录中安装一个简单的
    npm
    ,在内部处理所有这些步骤

    大概是这样的:

    package.json

    {
      [...]
      "scripts": {
        "postinstall": "node build.js && cd internal/ && npm install",
        "start": "node internal/app.js"
      }
      [...]
    }
    

    你可以写你自己的实现

    您需要编写package.json构建器,它可以生成package.json,其中依赖项只需要即可

    用法

    node package.json.builder.js prod+test
    npm install
    
    这里将创建package.json文件,其中包含package.dependencies.js中描述的依赖项

    实现

    1.将package.json添加到.gitignore

    2.创建文件package.json.builder.js将创建package.json文件

    let fs = require('fs');
    let pkgDep = require('./package.dependencies.js');
    
    let pkgTemplete = fs.readFileSync('./package.json.hbs', "utf8");
    let obj = {}, dep = [];
    
    if (process.argv[2]) {
      let array = process.argv[2].split('+');
    
      for (let i = 0; i < array.length; i++) {
        if (!pkgDep[array[i] + 'Dependencies']) {
          console.error(array[i] + 'Dependencies' + ' not found in package.dependencies.js');
        } else {
          dep.push(array[i] + 'Dependencies');
        }
    
    Object.assign(obj, pkgDep[array[i] + 'Dependencies'] || {});
      }
    }
    
    pkgTemplete = pkgTemplete.replace('{{dependencies}}', JSON.stringify(obj));
    
    fs.writeFileSync('./package.json', pkgTemplete);
    console.log('package.json created with ' + dep.join('+'));
    
    4.创建仅包含包及其版本列表的文件package.dependencies.js对象

    module.exports = {
      prodDependencies: {
        "babel-core": "6.26.0"
      },
      devDependencies: {
        "core-js": "2.5.5"
      },
      testDependencies: {
        "jest": "23.5.0"
      }
    }
    

    快速怀疑-您想这样做以保持本地包的私密性吗?还是为了防止它们被安装在生产中?为了保持它们的私密性。我测试了很多与工具链相关的东西,我需要检查一个包,将它与我的定制gulpfile一起用于实际应用程序,并提供反馈。它可能会,也可能不会最终进入生产和软件包。json不幸的是,这不是解决方案:我不想通过git与我的团队的其他成员共享依赖关系,我不需要用我需要和使用的软件包更改他们的节点模块。他们甚至不需要知道有人在玩这个工具链或者在向它添加什么(90%的人不使用我做的东西,尽管他们都依赖于package.json中的开发依赖项)
    module.exports = {
      prodDependencies: {
        "babel-core": "6.26.0"
      },
      devDependencies: {
        "core-js": "2.5.5"
      },
      testDependencies: {
        "jest": "23.5.0"
      }
    }