使用npm安装本地模块?

fan*_*ncy 360 javascript packages node.js npm npm-install

我有一个下载的模块仓库,我想在本地安装,而不是全局安装在另一个目录中?

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

Ric*_*aca 444

npm-link文档:

在本地模块目录中:

$ cd ./package-dir
$ npm link
Run Code Online (Sandbox Code Playgroud)

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

$ cd ./project-dir
$ npm link package-name
Run Code Online (Sandbox Code Playgroud)

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

$ cd ./project-dir
$ npm link ../package-dir
Run Code Online (Sandbox Code Playgroud)

这相当于使用上面的两个命令.

  • 这是迄今为止我见过的唯一一种理智的方法 - 为什么npm必须如此模糊/迟钝.关于创建一个本地包,安装它然后使用它,我不知道...链接工作,(和它的伟大),但术语相当混乱. (11认同)
  • @Rich Apodaca,感谢doc链接.它没有提到撤消该过程.看起来它只是创建符号链接,所以我可以正常删除它们? (6认同)
  • 但请记住,`npm link`将创建外部依赖项的第二个实例.因此,如果你有一个包A需要B和C,B需要C.链接B会导致应用程序A有两个C实例. (4认同)

fan*_*ncy 368

你只需要提供一个<folder>参数npm install,参数应该是本地文件夹而不是包名:

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

  • @bithavoc至少从5月5日开始,安装文件夹现在会创建一个符号链接,_not_副本.请参阅https://docs.npmjs.com/cli/install (24认同)
  • @FrankTan 是的,但是如何获得旧的行为?我*想要*副本! (11认同)
  • 与链接不同,它使用.npmignore. (5认同)
  • 在运行答案的脚本之前和之后使用 `rm -rf node_modules` 和 `npm install` 很好。 (3认同)
  • @FrankTan 有人说你可以先打包然后从包中安装来进行复制→ /sf/answers/4891762431/ (3认同)
  • 我尝试使用这种方式,但我的模块找不到它的peerDependencies. (2认同)
  • @Michael,不幸的是,据我从文档中可以看出,你不能再得到旧的行为了。 (2认同)

Luk*_*e W 137

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

来自docs:

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

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这可能不是问题的原始意图,但它可能是大多数通过谷歌找到这个想要的人. (9认同)
  • @ThomasPotaire两个答案都是正确的.如果你看一下npm链接文档,它会提供这两种方法,并将这种相对目录方法作为简写. (8认同)
  • 这个答案似乎不完整,您需要对文件夹运行一次“npm link”(以创建全局符号链接),然后在项目的文件夹中运行“npm link package-name”(以在项目中使用全局符号链接) 。下面的答案就是正确答案。 (2认同)
  • 第二种方法(使用“file:”方法)允许我的应用程序和本地模块共享依赖项。我对“npm link”的测试导致了重复的依赖项,如果依赖项需要用作单例,则会破坏一些东西。 (2认同)

Aka*_*ash 69

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

第 4 步:Install包装:

npm installnpm iyarn

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

祝你好运...

  • 这是最好的回复,因为它还安装了子依赖项! (2认同)

Kar*_*son 17

缺少主要财产?

正如前面的人已经回答的那样npm i --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

  • `npm --save`? 你的意思是“npm i --save”?(现在相当于“npm i”) (2认同)

Pau*_*ski 8

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

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

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule
Run Code Online (Sandbox Code Playgroud)

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

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


The*_*eff 8

所以到目前为止我提到的所有解决方案都有很多问题......

我有一个我想始终引用的本地包(而不是 npm 链接),因为它不会在这个项目之外使用(目前),也不会上传到 npm 存储库以供广泛使用。

我还需要它在 Windows 和 Unix 上工作,所以符号链接并不理想。

指向 (npm package) 的 tar.gz 结果适用于依赖的 npm 包文件夹,但是如果你想更新包,这会导致 npm 缓存出现问题。当您更新它时,它并不总是从引用的 npm 包中提取新的,即使您删除 node_modules 并为您的主项目重新执行 npm-install 也是如此。

所以..这对我来说很有效!

主项目的 Package.json 文件片段:

  "name": "main-project-name",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    ...
    "preinstall": "cd ../some-npm-package-angular && npm install && npm run build"
  },
  "private": true,
  "dependencies": {
    ...
    "@com/some-npm-package-angular": "file:../some-npm-package-angular/dist",
    ...
  }
Run Code Online (Sandbox Code Playgroud)

这实现了3件事:

  • 避免常见错误(至少对于有角度的 npm 项目)“index.ts 不是编译的一部分。” - 因为它指向构建的(dist)文件夹。
  • 添加预安装步骤来构建引用的 npm 客户端包,以确保构建了我们依赖包的 dist 文件夹。
  • 避免在本地引用 tar.gz 文件可能被 npm 缓存而不在主项目中更新而无需大量清理/故障排除/重新构建/重新安装的问题。

我希望这很清楚,并帮助某人。

tar.gz 方法也有点工作..

npm install (文件路径)也有点工作。

这一切都基于我们希望保留在单独位置的 openapi 规范生成的客户端(而不是对单个文件使用 copy-pasta)

====== 更新: ======

上述解决方案的常规开发流程存在其他错误,因为 npm 的本地文件版本控制方案绝对糟糕。如果您的依赖包频繁更改,则整个方案都会中断,因为 npm 将缓存您的项目的最后一个版本,然后在 SHA 哈希与您的 package-lock.json 文件中保存的内容不再匹配时爆炸,以及其他问题.

因此,我建议使用 *.tgz 方法,每次更改都会更新版本。这是通过做三件事来工作的。

第一的:

对于您的依赖包,请使用 npm 库“ng-packagr”。这会自动添加到由 OpenAPI 3.0 的 angular-typescript 代码生成器创建的自动生成的客户端包中。

因此,我引用的项目在 package.json 中有一个“脚本”部分,如下所示:

  "scripts": {
    "build": "ng-packagr -p ng-package.json",
    "package": "npm install && npm run build && cd dist && npm pack"
  },
Run Code Online (Sandbox Code Playgroud)

引用这个其他项目的项目添加了一个预安装步骤,以确保依赖项目在构建之前是最新的并重新构建:

  "scripts": {
    "preinstall": "npm run clean && cd ../some-npm-package-angular && npm run package"
  },
Run Code Online (Sandbox Code Playgroud)

第二

从您的主项目中引用构建的 tgz npm 包!

  "dependencies": {
    "@com/some-npm-package-angular": "file:../some-npm-package-angular/dist/some-npm-package-angular-<packageVersion>.tgz",
    ...
  }
Run Code Online (Sandbox Code Playgroud)

第三

每次更新依赖包时更新依赖包的版本。您还必须更新主项目中的版本。

如果你不这样做,当 SHA 哈希不匹配时,NPM 将阻塞并使用缓存版本并爆炸。NPM 根据文件名的变化版本基于文件的包。它不会在 package.json 中检查包本身是否有更新版本,并且 NPM 团队表示他们不会解决这个问题,但人们不断提出这个问题:https : //github.com/microsoft/WSL/issues/ 348

现在,只需更新:

"version": "1.0.0-build5",
Run Code Online (Sandbox Code Playgroud)

在依赖包的 package.json 文件中,然后在主项目中更新对它的引用以引用新文件名,例如:

"dependencies": {
       "@com/some-npm-package-angular": "file:../some-npm-package-angular/dist/some-npm-package-angular-1.0.0-build5.tgz",
        ...
}
Run Code Online (Sandbox Code Playgroud)

你会习惯的。只需更新两个 package.json 文件 - 版本然后是新文件名的引用。

希望能帮助某人...


小智 5

在为 CKEditor5 安装自定义构建包时,我遇到了与上述不同的解决方案。

所以我将包上传到应用程序根目录,比:

npm add file:./ckeditor5
Run Code Online (Sandbox Code Playgroud)

在我的 package.json 中,包被列为文件:

"ckeditor5-custom-build": "file:ckeditor5",
Run Code Online (Sandbox Code Playgroud)

我认为这个答案可能与如何添加本地包的主题相关。


归档时间:

查看次数:

200705 次

最近记录:

5 年,12 月 前