首页 文章

使用npm来安装或更新所需的软件包就像bundle for rubygems一样

提问于
浏览
86

我爱Bundler,它在依赖管理方面很棒 . 我爱npm,安装节点包很容易!我有一个nodejs应用程序,并希望无论我在哪里部署我的应用程序都是 able to specify my apps dependencies and easily install / update them . 这不是't a library I' m发布,它是一个完整的网络应用程序 .

我知道 npm bundle 命令,但这似乎只是覆盖了安装包的目录 .

我习惯以这种方式使用bundler:

# Gemfile
gem "rails", "3.0.3"

仅在主机上存在rails v3.0.3和任何其他必需的gem时才会存在

> bundle install

How can I achieve something similar with npm?

6 回答

  • 142

    从npm 1.0开始(现在,如果您按照README文件中的步骤,默认情况下会得到),“bundle”不再是一个隔离的东西 - 它只是“它是如何工作的” .

    所以:

    • package.json 文件放在项目的根目录中

    • 在该文件中列出您的deps

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
    
    • npm install 由于您're calling this with no args, and not in global mode, it' ll只是在本地安装所有deps .

    • require("express") ,快乐 .

  • 5

    编辑:这仅适用于npm版本<1.0


    想出这个很难,但是 NPM makes this possible .

    您需要三个组件

    • 存储库中的子目录(即 deps/

    • 上面列出了依赖关系的目录中的 package.json 文件

    • 上述目录中的 index.js 文件需要您的依赖项

    示例

    想象一下express是你唯一的依赖

    deps / package.json

    注意:每次修改依赖项时都会增加版本号

    {
      "name": "myapp_dependencies",
      "version": "0.0.1",
      "engines": {
        "node": "0.4.1"
      },
      "dependencies":{
        "express": "2.0.0beta2"
      }
    }
    

    deps / index.js

    export.modules = {
      express: require('express')
      //add more
    }
    

    现在,您应该能够使用npm安装依赖项 . 您甚至可以完成部署过程

    cd deps
    npm install
    

    然后在您的应用代码中,您可以访问您的特定版本的快递,如下所示:

    var express = require('myapp_dependencies').express;
    
  • 10

    你应该阅读Isaacs(作者npm)博客中的这两篇文章 . 我认为他们真的很好,我相信告诉你如何实现你的目标:

    我相信链接#1(第11点)解释了这个:

    11:将所有依赖项捆绑到包本身中当您使用npm bundle命令时,npm会将所有依赖项放入包中的node_modules文件夹中 . 但它并不止于此 . 如果您想依赖注册表中没有的内容,您可以这样做 . 只需这样做:npm bundle install http://github.com/whoever/whatever/tarball/master这会将该tarball的内容安装到bundle中,然后你可以将它列为依赖项,它不会尝试在安装软件包时安装它 . 如果你有自己的东西,并且不想更改名称,这也很方便 . 实际上,您可以在捆绑包上运行几乎任何npm命令 . 要查看内部的内容,您可以执行npm bundle ls . 要删除某些东西,请执行npm bundle rm thing . 当然,您可以安装多个版本并激活您想要的版本 .

  • 1

    从Npm版本1.1.2开始,有一个新命令npm shrinkwrap,它创建一个 npm-shrinkwrapped.json 文件,类似于 Gemfile.lock . 制作一个,以防止软件腐烂是很重要的(参见Bundler's rationale) . 特别是Nodejs拥有如此快速发展的社区 .

    bundle install 自动创建 Gemfile.lock 时, npm install 将不会创建 npm-shrinkwrapped.json (但会在存在时使用它) . 因此,您需要记住使用 npm shrinkwrap .

    阅读http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/的完整指南

  • 2

    在我看来,最简单的解决方案是将 package.json 文件与 private 标志(仅在上个月添加到npm)设置为 true . 这样,您可以运行 npm installnpm bundle 来获取项目的依赖项,但是您可以防止任何人意外发布您的非公共项目 .

    这是一个例子 package.json

    {
    "name": "yourProject"
    ,"version": "1.0.0"
    ,"dependencies": { "express" : ">=2.1.0" }
    ,"private": true
    }
    

    运行 npm install 将在本地系统上安装 express (如果它尚不存在);由于 "private": true ,运行 npm publish 会出错 .

    您和您的团队可以在内部使用版本标记来跟踪一段时间内的依赖关系更改 - 每次更改依赖关系时,都会使版本崩溃 . 要查看已安装的版本,请使用 npm ls installed .

  • 2

    同样使用 npm 发布您的应用程序,并在package.json文件中列出其依赖项 .

    当有人使用 npm 安装您的软件包时, npm 将负责解析其依赖项 .

    包规格:http://wiki.commonjs.org/wiki/Packages/1.0

相关问题