566

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

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

4

8 回答 8

605

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

npm install /path
于 2011-11-11T02:35:07.743 回答
561

npm-link 文档

在本地模块目录中:

$ cd ./package-dir
$ npm link

在项目目录下使用模块:

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

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

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

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

于 2013-09-13T04:49:23.833 回答
191

由于由同一个人提出并回答,我将添加一个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"
  }
于 2013-06-28T19:10:56.977 回答
92

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

祝你好运...

于 2020-01-16T09:37:54.103 回答
17

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

例如:

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

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

在这种情况下,npm 设置如下myprojectnode_modules/

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

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

因此,我们要么需要一种方法来告诉foonode在查找. 不幸的是,我也没有找到办法:(mymodulepackage.json

于 2018-11-08T20:12:38.403 回答
9

缺少主要属性?

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

于 2019-09-13T13:29:02.353 回答
9

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

我有一个我想始终引用的本地包(而不是 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",
    ...
  }

这实现了 3 件事:

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

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

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

npm install (file path) 也很有效。

这一切都基于从 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"
  },

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

  "scripts": {
    "preinstall": "npm run clean && cd ../some-npm-package-angular && npm run package"
  },

第二

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

  "dependencies": {
    "@com/some-npm-package-angular": "file:../some-npm-package-angular/dist/some-npm-package-angular-<packageVersion>.tgz",
    ...
  }

第三

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

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

现在,只需更新:

"version": "1.0.0-build5",

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

"dependencies": {
       "@com/some-npm-package-angular": "file:../some-npm-package-angular/dist/some-npm-package-angular-1.0.0-build5.tgz",
        ...
}

你会习惯的。只需更新两个 package.json 文件 - 版本然后将 ref 更新为新文件名。

希望对某人有所帮助...

于 2020-07-15T17:58:45.007 回答
0

对于更新版本的 npm(我在 macOS Big Sur 下使用 8.1.3),命令序列更加简单......

cd /path-where-your-local-project-is/
npm init

这将要求您提供一些与您的项目相关的数据并正确初始化您的project.json文件。

完成后,您可以安装其他模块:

cd /path-where-your-local-project-is/
npm install --save-dev some-npm-module .

这就是你所需要的!

注意:我相信如果您在项目目录中,则不需要尾随点,但我也认为添加它并没有什么坏处:-)

(我想知道为什么官方文档仍然没有解释这一点......)

于 2022-02-09T17:41:17.970 回答