package.json中的本地依赖项


449

我想做这样的事情,所以npm install还要安装package.jsonof ../somelocallib或更重要的是它的依赖项。

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

Answers:


577

npm> = 2.0.0

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

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

以下任何路径均有效:

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

本地包将被复制前缀./node-modules)。

npm <2.0.0

somelocallib作为依赖于你的package.json正常:

"dependencies": {
  "somelocallib": "0.0.x"
}

然后运行npm link ../somelocallib,npm将以符号链接的形式安装您正​​在使用的版本。

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

参考:link(1)


3
我们如何取消链接?
AtaurRehman Asad 2014年

13
使用“ npm link”安装本地软件包的不利之处在于,您会得到很多模块重复信息。当使用“模块:版本”或“模块:git-repo”列出依赖项时,npm install算法避免安装已安装在父软件包中的软件包。因此,使用“ npm链接”,如果您的主应用程序依赖于“ async@0.8.0”,而您的所有本地包也依赖于“ async@0.8.0”,那么您将以所有本地包安装“ async@0.8”结束。 0”,而不是使用相同的主应用程序已安装的“异步”版本。使用“ npm安装文件夹”不会发生这种情况。
Pedro Ballesteros 2014年

3
@PedroBallesteros您可以使用npm dedup来解决此问题。npmjs.org/doc/cli/npm-dedupe.html
danilopopeye 2014年

4
对于较新的npm版本,似乎不是这种情况。现在,创建了一个符号链接。
tsauerwein

2
@danilopopeye每个docs.npmjs.com/cli/install npm install <folder>描述说在当前项目中将软件包安装为目录中的符号链接。
赫尔曼·拉德克三世

211

现在可以package.json直接在您的本地指定本地Node模块的安装路径。从文档:

本地路径

从2.0.0版开始,您可以提供包含软件包的本地目录的路径。可以使用npm install -Snpm install --save使用以下任意形式保存本地路径:

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

在这种情况下,它们将被标准化为相对路径并添加到您的中package.json。例如:

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

此功能对于本地脱机开发和创建需要npm安装的测试很有用,您不需要在不希望访问外部服务器的地方安装npm,但是在将程序包发布到公共注册表时不应使用。


23
在npm v.3 +中,归一化是绝对的,而不是相对的,因此您会看到类似"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
如何在不增加版本的情况下更新本地路径依赖性?
Bohdan Lyzanets '16

3
顺便说一句,当和/或如果您尝试对节点应用程序进行docker化时,这会造成各种麻烦,因为标准node:onbuild映像仅复制当前目录,因此不包含任何内容../foo
donmartin '16

4
有什么方法可以将其与git + ssh集成在一起,以便可以从本地获取git存储库的本地副本,也可以npm install在LAN上拥有另一个git存储库?当我尝试上述操作并从git + ssh进行npm安装时,即使我正在安装顶层软件包,它似乎也会在node_modules目录中查找,而不是尝试通过git + ssh进行安装。
迈克尔(Michael)

1
安装工作。但是通过这种方式,当我尝试将模块导入到我的项目中时,我将得到“ ERR not found”。
C4d

87

这对我有用。

将以下内容放入您的package.json文件中

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
感谢您提出的不需要使用“ npm链接”的建议
ItalyPaleAle 2014年

它已.gitignore在module文件夹中删除,创建.npmignore并在我第一次运行时将其递归地应用于除以外的所有文件夹777 node_modules。但是,是的,它安装了依赖项。使用npm 1.4.14版本。
L0LN1NJ4 2014年

使用了这个,但我没有使用node_modules搞砸,而是使用app_modules
catalint 2014年

1
为什么不 "dependencies": { "my-own-module": "file:../my-own-module" }呢?
Bohdan Lyzanets '16

1
我在这里同意@Bohdan。localDependencies将做完全相同的事情。使用的好处npm link是您不需要npm install每次都进行更新以使依赖项保持最新。
froginvasion

30

如果您想进一步使它自动化,因为您正在将模块检入版本控制中,并且不想依赖记住npm链接的开发人员,则可以将其添加到package.json的“脚本”部分:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

这感觉不算是骇人听闻的,但似乎“可行”。从此npm问题获得了提示:https : //github.com/npm/npm/issues/1558#issuecomment-12444454


15
为什么postinstallpostupdate而不是preinstallpreupdate
2014年

1
您能再解释一下这是做什么的。即,如果我设置了一个具有多个根文件夹的vscode项目(即“多根工作空间”),它是否能够立即为使用项目反映模块文件夹中的更改?-这就是骇客的意思吗?
bvdb

25

这是添加本地依赖项的方法:

npm install file:src/assets/js/FILE_NAME

将其从NPM添加到package.json:

npm install --save file:src/assets/js/FILE_NAME

像这样直接添加到package.json中:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

硕士项目

这是您将用于主项目的package.json:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

那里./somelocallib相对于主项目package.json的库文件夹的引用。

参考:https : //docs.npmjs.com/files/package.json#local-paths


子项目

处理您的库依赖项。

除了运行外npm install,您还需要运行(cd node_modules/somelocallib && npm install)

这是NPM的已知错误。

参考:https//github.com/npm/npm/issues/1341(寻求更新的参考)


Docker注释

签入您的母版,package.lock然后签somelocallib/package.lock入源代码管理器。

然后在您的Dockerfile中使用:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

我在(cd A && B)结构中使用括号使运算等幂。


2

我知道那npm install ../somelocallib行得通。

但是,我不知道您在问题中显示的语法是否适用于package.json...

不幸的是,文档似乎只提到URL作为依赖项。

尝试file:///.../...tar.gz,指向一个压缩的本地库...,然后告诉我们它是否有效。


1
我在package.json中添加了“ dependencies”:{“ somemodule”:“ file:///./internal_modules/somemodule”}。没用 错误代码为“ npm ERR!代码E404”。
杰弗里

2

这对我有用:首先,确保npm目录具有正确的用户

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

然后您在package.json中链接目录

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
自XP en.wikipedia.org/wiki/NTFS_symbolic_link以来,Windows上的符号链接是可能的。以管理员身份打开命令行,然后运行npm install
草皮

2

实际上,从npm 2.0开始,现在支持本地路径(请参阅此处)。


8
迈克尔·特劳(Michael Trouw)几周前已经给出了这个答案,那么为什么要重复?
Dan Dascalescu

2

很好.....至少在Windows上(我的npm是3.something),我需要这样做:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

当我这样做时,npm install ../module1 --save它导致绝对路径,而不是文档中的相对路径。

我弄乱了一点,确定../xxx足够了。

具体来说,我已签出本地节点模块以说d:\ build \ module1,d:\ build \ module2和d:\ build \ nodeApp中的节点项目(应用程序)。

要“安装”,我:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

module1的package.json具有“ module2”依赖性:“ ../module2”; module2没有本地依赖关系;nodeApp具有依赖项“ module1”:“ ../ module1”和“ module2”:“ ../ module2”。

不确定这是否仅对我有用,因为所有3个文件夹(module1,module2和nodeApp)都位于同一级别上。


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.