ChatGPT解决这个技术问题 Extra ChatGPT

package.json 中的本地依赖

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

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

d
danilopopeye

npm >= 2.0.0

此功能是 npm 2.0.0 版中的 implemented。本地路径可以使用 npm install -Snpm install --save 保存,使用以下任何形式:

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

示例 package.json

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

npm ls

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

npm < 2.0.0

像往常一样将 somelocallib 作为依赖项放在 package.json 中:

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

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

参考:link(1)


我们如何取消链接?
使用“npm link”安装本地包的缺点是你会得到很多模块重复。当您使用“模块:版本”或“模块:git-repo”列出依赖项时,npm install 算法会避免安装已安装在父包中的包。因此,对于“npm link”,如果您的主应用程序依赖于“async@0.8.0”并且您所有的本地包也依赖于“async@0.8.0”,那么您将以安装“async@0.8”的所有本地包结束。 0”,而不是使用与主应用程序相同的已安装“异步”版本。使用“npm install folder”不会发生这种情况。
@PedroBallesteros 您可以使用 npm dedup 来解决此问题。 npmjs.org/doc/cli/npm-dedupe.html
“本地包将被复制......”似乎不是最近的 npm 版本。现在,创建了一个符号链接。
@danilopopeye Per docs.npmjs.com/cli/install npm install <folder> 描述说 在当前项目中将包作为符号链接安装在目录中。
C
Community

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

本地路径 从 2.0.0 版开始,您可以提供包含包的本地目录的路径。可以使用 npm install -S 或 npm install --save 保存本地路径,使用以下任何形式: ../foo/bar ~/foo/bar ./foo/bar /foo/bar 在这种情况下它们将被规范化到相对路径并添加到您的 package.json。例如: { "name": "baz", "dependencies": { "bar": "file:../foo/bar" } } 此功能有助于本地离线开发和创建需要安装 npm 的测试不想访问外部服务器,但在将包发布到公共注册表时不应使用。


在 npm v.3+ 中,标准化是绝对的,不是相对的,所以你会看到类似 "bar": "file:///home/user/src/foo/bar"
如何在不增加版本的情况下更新本地路径依赖?
顺便说一句,当您尝试对节点应用程序进行 docker 化时,这会导致各种麻烦,因为标准 node:onbuild 映像仅复制当前目录,因此会在 ../foo 中遗漏任何内容。
有没有办法将它与 git+ssh 集成,这样人们就可以拥有他们 npm install 的 git 存储库的本地副本或 LAN 上的另一个 git 存储库?当我尝试上述方法并从 git+ssh 安装 npm 时,它似乎在 node_modules 目录中查找,而不是尝试遍历 git+ssh,即使这是我安装顶级包的方式。
安装工作。但是这样我在尝试将模块导入我的项目时会得到“ERR not found”。
S
Saugat

这对我有用。

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

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

感谢您提供不需要使用“npm link”的建议
为什么不 "dependencies": { "my-own-module": "file:../my-own-module" }
我在这里同意@Bohdan。 localdependencies 会做同样的事情。使用 npm link 的优点是您无需每次都执行 npm install 来更新您的依赖关系。
新的 npm 版本 5 符号链接现在而不是复制它们的本地依赖项,这本身就会导致问题,您所要做的就是使用 @Bohdan 列出的 file:../my-own-module 格式。但是,符号链接位会导致其他问题,例如 nodemon。
这导致我'找不到模块“foo”'。进口货物不再起作用了。
S
Saugat

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

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

S
SgtPooki

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

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

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


为什么是 postinstallpostupdate 而不是 preinstallpreupdate
你能多解释一下这是做什么的吗?即,如果我设置一个具有多个根文件夹(即“多根工作区”)的 vscode 项目,它是否能够立即反映模块文件夹中的更改以用于消费项目? - 这就是黑客攻击的目的吗?
D
Dan

主项目

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

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

其中,./somelocallib 是对库文件夹相对于主项目 package.json 的引用。

参考:https://docs.npmjs.com/cli/v7/configuring-npm/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) 构造中使用括号来使操作具有幂等性。


i
itsazzad

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

提供包含包的本地目录的路径。

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

符号链接包文件夹 cd ~/projects/node-redis # 进入包目录 npm link # 创建全局链接 cd ~/projects/node-bloggy # 进入其他包目录。 npm link redis # 链接安装包


j
jeeves

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

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

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

因为我真的不想要硬链接,所以我尝试使用 url 代替:

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

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


"build": "node_modules\\.bin\\tsc", 这对我有用,而不是 ../~/file:///
H
H_I

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

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

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

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


我将 "dependencies": { "somemodule":"file:///./internal_modules/somemodule" } 添加到 package.json。它不起作用。错误代码是“npm ERR!代码 E404”。
npm i --save ./functions/node_modules/firebase 为我工作谢谢
P
Paul Duncan

好奇.....至少在 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)都位于同一级别......


s
scc

这对我有用:首先,确保 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" : "*"
}

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

使用纱线可以做到

yarn add file:../somelocallib


d
damirv

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


Michael Trouw 几周前已经给出了这个答案,那为什么要重复呢?
J
John Tribe

有很棒的 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" ]

A
Artyom

我想使用一组用 TypeScript 编写的本地依赖项,但这里没有一个答案对我有用。 npm install 只会拒绝构建依赖项。

我不得不求助于使用 tsconfig.json 将包添加到我的项目中 将它们标记为依赖项。由于某些依赖项相互依赖,我的用例变得更加复杂,我希望它们中的 all 来自本地文件夹。

这是我的解决方案:

// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@tiptap/*": [
        "tiptap/packages/*/src"
      ]
    }
  }
}

在上面的示例中,我有一个名为 tiptap/ 的本地项目子文件夹,并且 tiptap/packages/* 中有许多包。 "paths" 选项会将所有 @tiptap/foo 导入重写到 ./tiptap/packages/foo/src,包括我自己的文件和 tiptap/ 中的文件。

这不是一个好的解决方案,但它是唯一对我有用的东西。


S
Sahil Rajput

在 2021 年,您需要像这样使用它:

npm i my-pkg@file:./path-to-my-pkg.js

# To remove it later
npm un my-pkg

如果文件的文件或文件夹的路径带有 package.json,则在最后使用 .js

用法

const myPkg = require('my-pkg')

这就像魅力!