如何将本地模块指定为npm软件包依赖项


267

我有一个应用程序,该应用程序具有package.json文件中依赖项下指定的第三方模块(例如,“ express”)的通常依赖项。例如

"express"     : "3.1.1"

我想模块化地构造自己的代码,并由package.json安装一组本地(即我当前所在的文件系统上的)模块。我知道我可以通过运行安装本地模块:

npm install path/to/mymodule

但是,我不知道如何通过package.json依赖关系结构来实现这一点。--save在此命令中使用该选项只是将其"mymodule": "0.0.0"放入我的package.json中(不引用文件路径位置)。如果我随后从node_modules中删除已安装的版本,并尝试从package.json重新安装,它将失败(因为它在中央注册表中查找“ mymodule”,并且不在本地查找)。

我敢肯定,这是一种告诉"dependencies": {}结构我要从文件系统路径安装它的方法,但是不知道如何。

还有其他人有这个问题吗?谢谢。


1
一个非常好的问题。悲伤,就认识到,有没有功能等效package.json于我们所拥有的Gemfile秒。
Jarl 2014年

Answers:


403

npm install 现在支持

npm install --save ../path/to/mymodule

为此,mymodule必须将其配置为具有自己的模块package.json。请参阅创建NodeJS模块

从npm 2.0开始,本地依赖项受到本地支持。参见danilopopeye对类似问题的回答。我在此复制了他的回答,因为该问题在网络搜索结果中的排名很高。

此功能已在npm的2.0.0版本中实现。例如:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

以下任何路径均有效:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

同步更新

由于已npm install复制mymodulenode_modulesmymodule因此相关项目将不会自动看到来源更改。

有两种方法来更新依赖项目

  • 更新的版本,mymodule然后使用npm update:如上所示,package.json“依赖项”条目不包含版本说明符,就像正常依赖项所看到的那样。相反,对于本地依赖项,npm update只需尝试确保已安装最新版本(由决定mymodule)即可package.json。请参阅chriskelly对这个特定问题的答案

  • 使用重新安装npm install这将安装mymodule的源路径中的任何内容,即使它较旧,或已签出备用分支,也如此。


2
这对我有用。(我只是做了一条本地相对路径,例如"mymodule":"file:mymoduledir"
Don Rhummy

72
npm install --save ../my-local-repo
伊万·拉夫

15
以及如何在项目中使用它?我试图将其命名为import { HelloWorld } from "my-test-lib";,但收到“无法找到模块”错误。请看看stackoverflow.com/questions/46818083/...
维塔利Vasylenko

6
@LucioMollinedo可以共享如何导入本地模块的语法吗?与Vitallii一样,我也收到了“ Ca n't fine module”错误消息import { HelloWorld } from "my-test-lib";
Stan James

7
这与引用程序包的功能不同,因为不会将依赖项安装到项目中
Glass Cannon


11

最后我找不到整洁的方法,所以我去创建了一个目录local_modules,然后将此bashscript添加到scripts-> preinstall中的package.json中。

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done

5

在对该npm link命令进行了很多努力之后(为开发本地模块而不将其发布到注册表中或在node_modules文件夹中维护单独的副本的建议解决方案),我构建了一个小型npm模块来解决此问题。

该修复程序需要两个简单的步骤

第一:

npm install lib-manager --save-dev

其次,将此添加到您的package.json

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

有关更多详细信息,参见https://www.npmjs.com/package/lib-manager。希望它可以帮助某人。


0

如果可以简单地将预安装在node_modules中的模块与其他文件一起发布,则可以这样做:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

您可能还需要将模块存储在git上,并告诉父package.json从git安装依赖项:https : //npmjs.org/doc/json.html#Git-URLs-as-Dependencies


5
不幸的是,这将涉及将我的本地模块和第三方/贡献模块从注册表(例如,connect)安装在同一目录中的node_modules。除了从Git / VCS的角度来看令人困惑(即必须忽略node_modules中除我创建的模块之外的所有模块)之外,这也是一种不好的做法(我编写但未发布的那些应该与已编写并发布的那些保持分开) )。
Sam Adams

当我添加本地模块时,进行更改不会在我的主应用程序中看到。为什么会这样呢?
Mark Tyers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.