package.json中的本地依赖项

use*_*104 401 node.js npm

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

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}
Run Code Online (Sandbox Code Playgroud)

dan*_*eye 516

2014年9月更新

此功能是在npm的2.0.0版本中实现的.例:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}
Run Code Online (Sandbox Code Playgroud)

以下任何路径也有效:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar
Run Code Online (Sandbox Code Playgroud)

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


老答案

像往常一样把somelocallib依赖放在你package.json身上:

"dependencies": {
  "somelocallib": "0.0.x"
}
Run Code Online (Sandbox Code Playgroud)

然后运行npm link ../somelocallib,npm将安装你正在作为符号链接工作的版本.

app@0.0.1 /private/tmp/app
??? somelocallib@0.0.1 -> /private/tmp/somelocallib
Run Code Online (Sandbox Code Playgroud)

参考:link(1)

  • 使用"npm link"安装本地软件包的缺点是你会获得大量的模块重复.当您使用"module:version"或"module:git-repo"列出依赖项时,npm install algorithm避免安装已安装在父包中的包.因此,对于"npm link",如果您的主应用程序依赖于"async@0.8.0"并且所有本地软件包也依赖于"async@0.8.0",那么您将以安装"async@0.8"的所有本地软件包结束. 0"而不是使用相同的安装"async"版本的主应用程序.使用"npm install folder"不会发生这种情况. (10认同)
  • 我们如何取消联系呢? (3认同)
  • @PedroBallesteros你可以使用`npm dedup`来解决这个问题.https://www.npmjs.org/doc/cli/npm-dedupe.html (3认同)
  • 由于某种原因,当我尝试将 `~/foo/bar` 添加到 package.json 时,它不起作用。我使用“npm install --save”安装了该包,并将路径设置为“file:///Users/myuser/foo/bar”。 (2认同)
  • 对于较新的npm版本,似乎不是这种情况。现在,创建了一个符号链接。 (2认同)
  • @danilopopeye Per https://docs.npmjs.com/cli/install `npm install <folder>` 描述说 _Install 目录中的包作为当前项目中的符号链接。_ (2认同)

Mic*_*ouw 205

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

本地路径

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

../foo/bar
~/foo/bar
./foo/bar
/foo/bar
Run Code Online (Sandbox Code Playgroud)

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

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如何在没有版本递增的情况下更新本地路径依赖? (26认同)
  • 在npm v.3 +中,规范化是绝对的,_not relative_,所以你会看到像"bar"这样的东西:"file:/// home/user/src/foo/bar"` (21认同)
  • 有没有办法将它与git + ssh集成,这样一个人可以拥有一个git存储库的本地副本,他们可以从局域网安装`或局域网上的另一个git存储库?当我从git + ssh尝试以上和npm安装时,它似乎在node_modules目录中查看并且不会尝试查看git + ssh,即使这是我安装顶级软件包的方式. (4认同)
  • 顺便说一下,这会在和/或尝试对节点应用程序进行docker化时造成各种麻烦,因为标准的`node:onbuild`映像仅复制当前目录,因此在`../ foo`中不包含任何内容。 。 (3认同)
  • 安装工作。但是这样我会在尝试将模块导入我的项目时得到“未找到 ERR”。 (3认同)

Bri*_*ffe 85

这适合我.

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

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的建议,不需要使用"npm链接" (4认同)
  • 为什么不 `"dependencies": { "my-own-module": "file:../my-own-module" }` ? (3认同)
  • 我在这里同意@Bohdan。localdependencies 会做同样的事情。使用 `npm link` 的好处是你不需要每次都执行 `npm install` 来更新你的依赖项。 (2认同)

Tay*_*tay 29

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

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }
Run Code Online (Sandbox Code Playgroud)

这感觉超出了hacky,但它似乎"工作".从这个npm问题得到了提示:https: //github.com/isaacs/npm/issues/1558#issuecomment-12444454

  • 为什么`postinstall`和`postupdate`而不是`preinstall`和`preupdate`? (14认同)
  • 你能解释一下这是做什么的吗?即,如果我设置一个具有多个根文件夹(即“多根工作区”)的 vscode 项目,它是否能够立即反映使用项目的模块文件夹中的更改?- 这就是这个黑客的目的吗? (2认同)

小智 22

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

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"
....
Run Code Online (Sandbox Code Playgroud)


小智 12

2020 年,我在 Windows 10 上工作,尝试过

"dependencies": {
    "some-local-lib": "file:../../folderY/some-local-lib" 
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

由于我并不真正想要硬链接,因此我尝试使用网址代替:

"dependencies": {
    "some-local-lib": "file:///D:\\folderX\\folderY\\some-local-lib.tar" 
     ....
}
Run Code Online (Sandbox Code Playgroud)

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


its*_*zad 8

完整本地开发的两个步骤:

  1. 提供包含包的本地目录的路径。
{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 符号链接包文件夹

    cd ~/projects/node-redis    # go into the package directory
    npm link                    # creates global link
    cd ~/projects/node-bloggy   # go into some other package directory.
    npm link redis              # link-install the package
    
    Run Code Online (Sandbox Code Playgroud)


Wil*_*ken 6

硕士项目

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

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}
Run Code Online (Sandbox Code Playgroud)

那里./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)
# ...
Run Code Online (Sandbox Code Playgroud)

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


小智 6

使用纱线可以这样做

yarn add file:../somelocallib


Eli*_*ski 6

使用工作区

使用 的缺点file:../path/to/your-library是您必须npm install或 使用npm link才能使更改在导入您的包的包中生效。

PNPM

如果您使用 pnpm:更好的解决方案是使用workspace:协议workspace:../path/to/your-library。它会将目录符号链接到您的node_modules,而不是复制它,因此源中的任何更改都会立即生效。

例如:

  ...
  "dependencies": {
    ...
    "my-package": "workspace:../../dist"
  },

Run Code Online (Sandbox Code Playgroud)

注意:此解决方案旨在在工作区中使用,因此您可能需要pnpm-workspace.yaml在项目的根目录中创建(即使是空的)文件。

纱线/npm

设置相同,但workspace关键字不可用:

  ...
  "dependencies": {
    ...
    "my-package": "../../dist"
  }
Run Code Online (Sandbox Code Playgroud)

还要确保将“my-package”添加到 package.json 文件中的“workspaces”中。阅读更多


H_I*_*H_I 5

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

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

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

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