使用 npm 安装本地module?

IT技术 javascript node.js npm packages npm-install
2021-02-09 04:29:02

我有一个下载的module存储库,我想在本地安装它,而不是在另一个目录中全局安装?

有什么简单的方法可以做到这一点?

6个回答

您只需向 提供一个<folder>参数npm install,参数应指向本地文件夹而不是包名称:

npm install /path
与链接不同,它使用 .npmignore。
2021-03-20 04:29:02
我尝试使用这种方式,但我的module找不到它的 peerDependencies。
2021-03-25 04:29:02
@FrankTan 是的,但如何获得旧行为?副本!
2021-03-27 04:29:02
@bithavoc 至少从 npm 5 开始,安装文件夹现在会创建符号链接,而不是副本。请参阅docs.npmjs.com/cli/install
2021-03-29 04:29:02
在运行答案的脚本rm -rf node_modules之前和npm install之后都很好
2021-04-08 04:29:02

npm-link 文档

在本地module目录中:

$ cd ./package-dir
$ npm link

在项目目录下使用module:

$ cd ./project-dir
$ npm link package-name

或者一次性使用相对路径:

$ cd ./project-dir
$ npm link ../package-dir

这相当于在幕后使用上面的两个命令。

但是请记住,这npm link将创建外部依赖项的第二个实例。所以如果你有一个包 A 需要 B 和 C,B 需要 C。链接 B 将导致应用程序 A 有 C 的两个实例。
2021-03-14 04:29:02
@TylerCollier npm unlink 似乎是镜像操作stackoverflow.com/a/24940024/54426
2021-03-21 04:29:02
这是迄今为止我见过的唯一看起来很理智的方法 - 为什么 npm 必须如此晦涩/迟钝。关于创建本地包,安装它然后使用它,我不知道......链接有效,(而且它很棒),但术语相当混乱。
2021-04-10 04:29:02
@Rich Apodaca,感谢提供文档链接。它没有提到撤消该过程。看起来它所做的只是创建符号链接,所以我可以正常删除它们?
2021-04-11 04:29:02
请注意,如果您使用 Angular2(或者可能是其他应用程序?),围绕 npm 链接是特定类型问题的根本原因有一些嗡嗡声。这里这里的例子
2021-04-11 04:29:02

由于由同一个人提问和回答,我将添加一个npm 链接作为替代。

来自文档:

这对于安装您自己的东西很方便,这样您就可以对其进行处理和迭代测试,而无需不断重建。

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[编辑] 从 NPM 2.0 开始,您可以在 package.json 中声明本地依赖项

"dependencies": {
    "bar": "file:../foo/bar"
  }
@ThomasPotaire 两个答案都是正确的。如果您查看 npm 链接文档,它会提供两种方法,并使用这种相对目录方法作为速记。
2021-03-16 04:29:02
这个答案似乎不完整,您需要npm link对文件夹运行一次(以创建全局符号链接),然后npm link package-name在项目的文件夹中运行(以在项目中使用全局符号链接)。下面的答案是正确的答案。
2021-03-19 04:29:02
我有一个本地包(比如包1),包2有一个依赖包1的相对路径。当相对路径以 "file:../../package1" 开头时,npm 我不安装包,当它是 ''../../package1" 时工作,在开头添加文件意味着什么吗?
2021-03-22 04:29:02
第二种方法(使用该file:方法)允许我的应用程序和本地module共享依赖项。我的测试npm link导致重复依赖,如果依赖需要用作单例,这会破坏事情。
2021-03-26 04:29:02
这可能不是问题的初衷,但这可能是大多数通过谷歌找到这个问题的人想要的。
2021-04-05 04:29:02

npm pack + package.json

这对我有用:

第 1 步:在 中module project,执行npm pack

这将构建一个<package-name>-<version>.tar.gz文件。

第 2 步:将文件移动到 consumer project

理想情况下,您可以将所有此类文件放在目录中的tmp文件夹中consumer-project

第 3 步:在您的package.json

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

第 4 步:Install包装:

npm installnpm iyarn

现在,您的包将在您的consumer-project's node_modules文件夹中可用

祝你好运...

我在打包之前忘记构建我的包,所以 npm run build before。
2021-03-21 04:29:02
是的,如果您使用file:<package_root_path>(不是包文件的路径)dependencies从本地文件系统安装包。本地包不会复制到您的node_modules,而是链接到node_modules. 使用npm i,可以自动安装子依赖项,但不能与其他包共享子依赖项。在这种情况下,instanceof如果要将关键字用于本地项目中的对象,则关键字可能无法按预期工作。所以,我认为npm pack+package.json是一个合理的解决方案。
2021-03-28 04:29:02
这是最好的回复,因为它还安装了子依赖项!
2021-04-06 04:29:02

如果本地module具有您只想在项目范围内安装的对等依赖项,则这些方法(npm linkpackage.json文件依赖项)都不起作用。

例如:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

在这种情况下, npm 设置myproject'snode_modules/是这样的:

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

当 node 加载mymodule并执行时require('foo'), node 解析mymodule符号链接,然后只查找/local/mymodule/node_modules/(及其祖先) for foo,它没有找到。相反,我们希望 node 在 中查找/local/myproject/node_modules/,因为这是从哪里运行我们的项目以及foo安装在哪里

所以,我们要么需要以某种方式告诉节点解决这个符号链接寻找的时候foo,或者我们需要一种方法来告诉NPM安装一个副本mymodule时候文件相关的语法中使用package.json不幸的是,我也没有找到办法:(

我遇到了同样的问题。我找到了这个答案:stackoverflow.com/questions/50807329/...,这解决了我的对等依赖项和本地库的问题。
2021-03-13 04:29:02
有一个解决方案。将依赖module放在项目根文件夹中使用通常的“file:”前缀package.json 中定义您的依赖项npm i这将在项目的 node_modules 中创建一个符号链接,并且它的依赖项可能会像其他类型的依赖项一样被提升到顶级 node_modules。我的 npm 版本是 v6.14.4 。在花了几个小时解决这个问题后,在这里找到了这个解决方案:(atmos.washington.edu/~nbren12/reports/journal/...)。谢谢nbren12。
2021-03-16 04:29:02
我发现了一个解决办法,这是设置NODE_PATH为指向node_modules/哪里foo安装。所以对于上面的情况,就是这样: NODE_PATH=/dev/myproject/node_modules/ 这允许mymodulefind foo
2021-03-31 04:29:02