package.json中的本地依赖项

时间:2013-01-17 15:02:38

标签: node.js npm

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

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

13 个答案:

答案 0 :(得分:461)

2014年 - 9月更新

此功能在npm版本2.0.0中为implemented。例如:

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

以下任何路径也有效:

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

本地包将copied prefix./node-modules)。


旧答案

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)

答案 1 :(得分:198)

现在可以直接在package.json中指定本地节点模块安装路径。来自文档:

  

Local Paths

     

从版本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安装的测试,但在将包发布到公共注册表时不应使用此功能。

答案 2 :(得分:82)

这适合我。

将以下内容放在package.json文件

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

答案 3 :(得分:24)

如果你想进一步自动化这个,因为你正在检查你的模块到版本控制,并且不想依赖开发人员记住npm链接,你可以将它添加到你的package.json“scripts”部分:< / p>

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

这感觉超出了hacky,但似乎“有效”。得到了这个npm问题的提示: https://github.com/isaacs/npm/issues/1558#issuecomment-12444454

答案 4 :(得分:20)

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

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"
....

答案 5 :(得分: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.locksomelocallib/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)构造中使用括号使运算幂等。

答案 6 :(得分:3)

答案 7 :(得分:2)

我知道npm install ../somelocallib有效。

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

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

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

答案 8 :(得分: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" : "*"
}

答案 9 :(得分:2)

实际上,从npm 2.0开始,现在支持本地路径(参见here)。

答案 10 :(得分:2)

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

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

当我执行npm install ../module1 --save时,它会产生绝对路径,而不是文档中的相对路径。

我更多地搞砸了一点,并确定../xxx就足够了。

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

安装&#39;,我:

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&quot;的package.json依赖于&#34; module2&#34;:&#34; ../ module2&#34 ;; module2没有本地依赖; nodeApp具有依赖关系&#34; module1&#34;:&#34; ../ module1&#34;和&#34; module2&#34;:&#34; ../ module2&#34;。

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

答案 11 :(得分:0)

在2020年,我尝试使用Windows 10

"dependencies": {
    "some-local-lib": "file:../../folderY/some-local-lib" 
    ...
}

然后进行npm安装。结果是在node-modules中创建了该文件夹的快捷方式。 这行不通。您需要一个硬链接-Windows支持,但是 您必须在Windows中做一些额外的操作才能创建硬符号链接。

由于我真的不想要硬链接,所以我尝试使用网址代替:

"dependencies": {
    "some-local-lib": "file:///D:\\folderX\\folderY\\some-local-lib.tar" 
     ....
}

这很好用。
tar(您必须将库的build / dist文件夹中的东西tar压缩)提取到节点模块中的真实文件夹中,并且可以像其他所有内容一样导入。
显然,tar部分有点烦人,但是由于“ some-local-lib”是一个库(无论如何都必须构建),因此我更喜欢这种解决方案,而不是创建硬链接或安装本地npm。

答案 12 :(得分:0)

有很棒的 yalc 可以帮助管理本地包。它帮助我使用了我后来部署的本地库。只需使用 .yalc 目录打包项目(带或不带 /node_modules)。所以就这样做:

npm install -g yalc  

in directory lib/$ yalc publish 

在项目中:

project/$ yalc add lib

project/$ npm install 

就是这样。

当您想要更新内容时:

lib/$ yalc push   //this will updated all projects that use your "lib"

project/$ npm install 

使用 Docker 打包和部署

tar -czvf <compresedFile> <directories and files...>
tar -czvf app.tar .yalc/ build/ src/ package.json package-lock.json

注意:记得添加.yalc目录。

在Docker中:

FROM node:lts-alpine3.9

ADD app.tar /app

WORKDIR /app
RUN npm install

CMD [ "node", "src/index.js" ]