如何将本地模块指定为npm包依赖项

Sam*_*ams 221 node.js npm

我有一个应用程序,它对依赖项下的package.json文件中指定的第三方模块(例如'express')具有通常的依赖关系.例如

"express"     : "3.1.1"
Run Code Online (Sandbox Code Playgroud)

我想模块化地构建我自己的代码,并且有一组本地(意思是我当前在文件系统上)的模块由package.json安装.我知道我可以通过运行来安装本地模块:

npm install path/to/mymodule
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何通过package.json依赖项结构实现这一点.使用--save此命令中的选项只是放入"mymodule": "0.0.0"我的package.json(不引用文件路径位置).如果我然后从node_modules中删除已安装的版本,并尝试从package.json重新安装,它将失败(因为它在中央注册表中查找"mymodule",并且看起来不是本地的).

我确信这是一种告诉"dependencies": {}结构我希望从文件系统路径安装它的方法,但不知道如何.

还有其他人有这个问题吗?谢谢.

Ran*_*Dev 327

从NPM 2.0.0开始,本机支持导入本地依赖项.danilopopeye在回答类似问题记录了这一点.我在这里复制了他的回复,以帮助任何需要找到正确答案的人,因为这个问题在Google的搜索结果中排名很高.

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

npm install --save ../my-local-repo
Run Code Online (Sandbox Code Playgroud)

以下任何路径也有效:

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

  • ````npm install --save ../ my-local-repo``` (70认同)
  • 以及如何在项目中使用它?我试图把它称为`import {HelloWorld}来自"my-test-lib";`,但我收到"找不到模块"错误.请看一下/sf/ask/3277265841/ (11认同)
  • 和大家一样,我不明白如何导入模块?有人可以分享这一关键信息,也许可以更新答案吗?如果不能使用本地模块,引用它是没有意义的??? (11认同)
  • 这与引用包不同,因为不会将依赖项安装到项目中 (4认同)
  • @LucioMollinedo您可以分享导入本地模块的语法吗?和Vitallii一样,我在"my-test-lib"中使用`import {HelloWorld}得到"无法精确模块"错误; (3认同)
  • 如果我将模块 baz 包含在另一个模块(例如主模块)中,则当我在主模块上运行 npm install 时找不到 bar 模块。有什么解决办法吗? (3认同)
  • 这对我有用.(我只是做了一个像"mymodule"这样的本地相对路径:"file:mymoduledir"` (2认同)
  • 我尝试了同样的操作,但它抛出错误 npm ERR! 代码 ENOLOCAL npm 错误!无法从“../../../../../WebstormProjects/project-name”安装,因为它不包含 package.json 文件。 (2认同)
  • @inigo 为什么要添加有关同步更新的警告?我刚刚在 macOS 上使用 npm 6.14.8 进行了尝试,它创建了一个符号链接,因此更新会自动传播。 (2认同)
  • 这在 npm 中不再适用。有一个 [npm 问题和重现](https://github.com/npm/cli/issues/2339#issuecomment-904748108) 证明这不起作用,因为从版本 7 开始进行了故意的重大更改。 (2认同)
  • 对于“找不到模块”错误,不要忘记在链接包的文件夹中运行“npm build”。 (2认同)

jas*_*ord 40

请参阅:package.json中的本地依赖项

看起来答案是npm link:https://docs.npmjs.com/cli/link

  • 实际上npm链接只会创建符号链接,而不会修改package.json来添加本地依赖关系 (5认同)
  • 但是如果它不是一个“符号链接”,一旦依赖项完成构建,父项目如何知道重建? (2认同)

Sam*_*ams 9

我最终找不到一个简洁的方法,所以我去创建一个名为的目录local_modules,然后在脚本 - > preinstall中将这个bashscript添加到package.json中

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done
Run Code Online (Sandbox Code Playgroud)


Tar*_*ngh 9

以下内容应该有所帮助(假设库和应用程序共享相同的父文件夹)

图书馆

npm pack // this will pack the library in a .tgz file
Run Code Online (Sandbox Code Playgroud)

在需要库的应用程序

npm i ../mylibrary/../library-package-X.X.tgz
Run Code Online (Sandbox Code Playgroud)

这将对您的应用程序进行以下更改

package.json现在将有

 "@mylibrary": "file:../mylibrary/library-package-X.X.tgz",
Run Code Online (Sandbox Code Playgroud)


小智 7

您只需添加到项目中的 package.json 文件即可

"package-name" : "path/to/package"
Run Code Online (Sandbox Code Playgroud)

然后npm i在你的项目中运行


小智 6

在使用该npm link命令(无需将它们发布到注册表或在 node_modules 文件夹中维护单独副本的情况下开发本地模块的建议解决方案)苦苦挣扎之后,我构建了一个小的 npm 模块来帮助解决这个问题。

修复需要两个简单的步骤

第一的:

npm install lib-manager --save-dev
Run Code Online (Sandbox Code Playgroud)

其次,将此添加到您的package.json

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}
Run Code Online (Sandbox Code Playgroud)

更多详细信息,访问https://www.npmjs.com/package/lib-manager。希望它可以帮助某人。


Jos*_*ein 5

在工作中,我们有一个通用库,由单个存储库中的几个不同项目使用。最初我们使用发布的(私有)版本(npm install --save rp-utils),但这导致我们开发时进行了大量不必要的版本更新。该库位于应用程序的姐妹目录中,我们可以使用相对路径而不是版本。package.json 中的 "rp-utils": "^1.3.34" 现在是:

{ 
  "dependencies": { ...
    "rp-utils": "../rp-utils",
   ...
Run Code Online (Sandbox Code Playgroud)

rp-utils 目录包含可发布的 npm 包

  • 每当您更改导入的包时,您都需要重建它,然后在使用它的应用程序中“npm update rp-utils”更新该依赖项。 (2认同)