88

我喜欢Bundler,它非常擅长依赖管理。我喜欢npm,安装节点包很容易!我有一个 nodejs 应用程序,并且希望能够指定我的应用程序依赖项并在我部署我的应用程序的任何地方轻松安装/更新它们。这不是我要发布的库,它是一个成熟的网络应用程序。

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

我习惯于以这种方式使用捆绑器:

# Gemfile
gem "rails", "3.0.3"

仅当主机上不存在 rails v3.0.3 和任何其他必需的 gem 时才安装它

> bundle install

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

4

6 回答 6

148

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

所以:

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

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

  4. require("express")而且要快乐。
于 2011-05-16T20:42:42.293 回答
10

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


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

你需要三个组件

  1. 存储库中的子目录(即deps/
  2. package.json上述目录中列出依赖项的文件
  3. index.js上述目录中需要你的依赖项的文件

例子

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

部门/package.json

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

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

部门/index.js

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

现在您应该可以使用 npm 安装依赖项了。您甚至可以将此作为部署过程的一部分

cd deps
npm install

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

var express = require('myapp_dependencies').express;
于 2011-03-13T11:48:19.340 回答
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/

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

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

当您使用 npm bundle 命令时,npm 会将所有依赖项放入包中的 node_modules 文件夹中。但它并不止于此。

如果你想依赖注册表中没有的东西,你可以这样做。只需这样做:

npm bundle install http://github.com/whoever/whatever/tarball/master 这会将那个 tarball 的内容安装到包中,然后你可以将它列为依赖项,它不会尝试安装它时您的软件包已安装。

如果你有自己的 fork 并且不想更改名称,这也很方便。

事实上,您几乎可以在包中运行任何 npm 命令。要查看里面的内容,您可以执行 npm bundle ls。要删除某些内容,请执行 npm bundle rm 的操作。而且,当然,您可以安装多个版本并激活您想要的版本。

于 2011-02-02T12:33:03.670 回答
2

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

这是一个例子package.json

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

如果本地系统尚不存在,Runningnpm install将安装在本地系统上;express由于. npm publish_"private": true

您和您的团队可以在内部使用版本标签来跟踪依赖项随时间的变化——每次更改依赖项时,都会更新版本。要查看您安装的版本,请使用npm ls installed.

于 2011-03-30T02:36:10.293 回答
2

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

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

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

于 2013-02-20T14:56:09.180 回答
1

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

当有人用来npm安装你的包时,npm会负责解决它的依赖关系。

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

于 2011-02-02T07:52:27.963 回答