使用npm安装本地模块?


Answers:


479

npm-link文档中

在本地模块目录中:

$ cd ./package-dir
$ npm link

在要使用模块的项目目录中:

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

或一次性使用相对路径:

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

这等效于在幕后使用上面的两个命令。


14
这是我迄今为止所见的唯一神智的方法-为什么npm必须如此晦涩/晦涩。关于创建本地软件包,安装它然后使用它的问题,我不知道...链接有效(及其出色),但是术语相当混乱。
smaudet 2015年

6
@Rich Apodaca,感谢您的文档链接。它没有提及撤消该过程。看起来它所做的只是创建符号链接,因此我可以照常删除它们吗?
泰勒·科利尔

1
@TylerCollier npm取消链接似乎是镜像操作stackoverflow.com/a/24940024/54426
Rich Apodaca

1
请注意,如果您使用Angular2(或其他应用程序?),npm链接会引起某些嗡嗡声,这是特定类型问题的根本原因。这里这里的
红豌豆

4
但是请记住,这npm link将创建外部依赖项的第二个实例。所以,如果你有一个包,需要B和C,B需要C.连接B就导致应用程序A有C的两个实例
user2167582

421

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

npm install /path

5
与链接不同,它使用.npmignore。
卡米尔·温兹

30
@bithavoc至少从npm 5开始,现在安装文件夹会创建一个符号链接,而不是副本。参见docs.npmjs.com/cli/install
Frank Tan

3
我尝试使用这种方式,但是我的模块找不到它的peerDependencies。
Witalo Benicio

1
在运行答案的脚本rm -rf node_modules之前和npm install之后都很好。
Renato

2
@FrankTan是的,但是如何获得旧的行为?我副本!
迈克尔

150

由于是由同一个人询问和回答的,因此我将添加一个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"
  }

11
这可能不是问题的初衷,但这可能是大多数通过Google找到此问题的人想要的。
Dusty J

1
这个答案似乎不完整,您需要npm link对文件夹运行一次(以创建全局符号链接),然后npm link package-name在项目的文件夹中运行(以在项目中使用全局符号链接)。下面的答案是正确的答案。
Thomas Potaire 2014年

8
@ThomasPotaire两个答案都是正确的。如果您查看npm链接文档,它将介绍这两种方法,并以这种相对目录方法为简写。
MJ 2014年

1
第二种方法(使用该file:方法)允许我的应用程序和本地模块共享依赖项。我对的测试npm link导致了重复的依赖关系,如果需要将依赖关系作为单例使用,则会造成破坏。
Daniel Waltrip

我有一个本地包(例如package1),package2有一个依赖项,该依赖项与package1的相对路径有关。npm我相对路径以“ file:../../ package1”开头时未安装软件包,当其为“ ../../package1”时有效,请问开头是否添加文件还有其他含义?
Dip686

15

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文件夹中可用。

祝好运...


9

如果本地模块具有仅在项目范围内安装的对等依赖项,则这些方法(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"
  }

在这种情况下,故宫建立myprojectnode_modules/是这样的:

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

当节点加载mymodule并加载时require('foo'),节点解析mymodule符号链接,然后仅查找/local/mymodule/node_modules/(及其祖先)foo找不到的链接。相反,我们希望节点查看/local/myproject/node_modules/,因为那是从中运行我们的项目的位置以及foo安装的位置。

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


我发现了一个解决办法,这是设置NODE_PATH为指向node_modules/哪里foo安装。因此,对于上述情况,将是这样: NODE_PATH=/dev/myproject/node_modules/ 允许mymodulefind foo
Paul Medynski '18年

有一个解决方案。将依赖项模块放在项目根文件夹中。使用通常的'file:'前缀在package.json中定义您的依赖项。不要npm i这将在项目的node_modules中创建一个符号链接,并且其依赖关系可能会像其他类型的依赖关系一样被提升到顶层node_modules。我的npm版本是v6.14.4。在花费了几个小时解决问题后,请在此处找到以下解决方案:(atmos.washington.edu/~nbren12/reports/journal / ...)。谢谢nbren12。
sasebot

我也遇到了同样的麻烦。我找到了这个答案:stackoverflow.com/questions/50807329/…,这解决了我的同级依赖关系和本地库问题。
theawless

0

缺少主要财产?

正如先前的人们所回答npm --save ../location-of-your-packages-root-directory。该../location-of-your-packages-root-directory但是必须有两件事情,以便为它工作。

1)package.json在该目录中指向

2)main在属性package.json必须被设置和工作IG "main": "src/index.js",是否为入口文件../location-of-your-packages-root-directory就是../location-of-your-packages-root-directory/src/index.js

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.