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

时间:2011-02-02 07:49:04

标签: javascript dependencies node.js bundler npm

我喜欢Bundler,它非常适合依赖管理。我喜欢npm,安装节点包很容易!我有一个nodejs应用程序,并希望能够指定我的应用程序依赖项并轻松安装/更新它们无论我在哪里部署我的应用程序。这不是我发布的图书馆,它是一个完整的网络应用程序。

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

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

# Gemfile
gem "rails", "3.0.3"

仅在主机上存在rails v3.0.3和任何其他所需的宝石

> bundle install

如何使用npm实现类似的功能?

6 个答案:

答案 0 :(得分:144)

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

所以:

  1. package.json文件放在项目的根目录中
  2. 在该文件中列出您的deps

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
    
  3. npm install由于您在没有args的情况下调用它,而不是在全局模式下调用它,它只会在本地安装所有deps。

  4. require("express")并且快乐。

答案 1 :(得分:10)

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


很难弄清楚这一点,但 NPM使这成为可能

您需要三个组件

  1. 存储库中的子目录(即deps/
  2. 上述目录中列出依赖关系的package.json文件
  3. 上述目录中需要您的依赖项的index.js文件
  4. 实施例

    想象一下,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;
    

答案 2 :(得分:5)

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

  1. http://blog.izs.me/post/1675072029/10-cool-things-you-probably-didnt-realize-npm-could-do
  2. http://foohack.com/2010/08/intro-to-npm/
  3. 我相信链接#1(第11点)解释了这一点:

      

    11:将所有依赖项捆绑到包本身

         

    当你使用时   npm bundle命令,npm将全部放入   你的依赖关系   包中的node_modules文件夹。   但它并不止于此。

         

    如果你想要依赖某些东西   那不是在注册表上,你可以做到   那。就这样做:

         

    npm bundle install   http://github.com/whoever/whatever/tarball/master   这将安装它的内容   tarball进入捆绑,然后你   可以将它列为依赖项,它   当你的时候不会尝试安装它   包已安装。

         

    如果你有你的话,这也很方便   拥有某种东西的叉子,并且会   不想改名。

         

    事实上,你几乎可以运行任何npm   捆绑的命令。看看是什么   在里面,你可以做npm bundle ls。至   删除一些东西,做npm捆绑rm   事情。当然,你可以安装   多个版本并激活一个   你想要的。

答案 3 :(得分: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(如果它尚不存在);由于npm publish

,运行"private": true会出错

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

答案 4 :(得分:2)

从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/

的完整指南

答案 5 :(得分:1)

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

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

套餐规格:http://wiki.commonjs.org/wiki/Packages/1.0