我有一个下载的模块存储库,我想在本地安装它,而不是全局安装在另一个目录中?
有什么简单的方法可以做到这一点?
在本地模块目录中:
$ cd ./package-dir
$ npm link
在项目目录下使用模块:
$ cd ./project-dir
$ npm link package-name
或者一次性使用相对路径:
$ cd ./project-dir
$ npm link ../package-dir
这相当于在后台使用上面的两个命令。
npm link
将创建外部依赖项的第二个实例。所以如果你有一个包 A 需要 B 和 C,B 需要 C。链接 B 将导致应用程序 A 有两个 C 实例。
由于由同一个人提问和回答,我将添加一个 npm link 作为替代。
来自文档:
这对于安装你自己的东西很方便,这样你就可以在它上面工作并迭代地测试它,而不必不断地重建。
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"
}
npm link
(以创建全局符号链接),然后在项目文件夹中运行 npm link package-name
(以在项目中使用全局符号链接)。下面的答案是正确的答案。
file:
方法)允许我的应用程序和本地模块共享依赖项。我对 npm link
的测试导致了重复的依赖项,如果需要将依赖项用作单例,这会破坏事情。
npm 包 + package.json
这对我有用:
步骤 1:在模块项目中,执行 npm pack:
这将构建一个 <package-name>-<version>.tar.gz
文件。
第 2 步:将文件移动到消费者项目
理想情况下,您可以将所有此类文件放在 consumer-project
根目录中的 tmp
文件夹中:
第 3 步:在您的 package.json 中引用它:
"dependencies": {
"my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}
第 4 步:安装软件包:
npm install
或 npm i
或 yarn
现在,您的包将在您的消费者项目的 node_modules 文件夹中可用。
祝你好运...
dependencies
中使用 file:<package_root_path>
(不是包文件的路径)从本地文件系统安装包。本地包不会复制到您的 node_modules
,而是链接到 node_modules
。使用 npm i
可以自动安装子依赖,但不能与其他包共享子依赖。在这种情况下,如果您想将关键字用于本地项目中的对象,instanceof
关键字可能无法按预期工作。所以,我认为 npm pack
+ package.json
是一个合理的解决方案。
如果本地模块具有您只想安装在项目范围内的对等依赖项,则这些方法(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 像这样设置 myproject
的 node_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 安装一个 copy 的 { 2} 当 package.json
中使用文件依赖语法时。不幸的是,我也没有找到办法:(
NODE_PATH
设置为指向安装 foo
的 node_modules/
。因此,对于上述情况,它将是这样的: NODE_PATH=/dev/myproject/node_modules/
允许 mymodule
找到 foo
。
缺少主要属性?
正如以前的人已经回答了npm i --save ../location-of-your-packages-root-directory
。但是,../location-of-your-packages-root-directory
必须具备两个条件才能使其工作。
该目录中的 package.json 指向 package.json 中的 main 属性,如果 ../location-of-your-packages-root 的条目文件必须设置和工作 ig "main": "src/index.js" -目录是 ../location-of-your-packages-root-directory/src/index.js
npm --save
?你是说npm i --save
? (现在相当于 npm i
)
所以到目前为止我提到的所有解决方案都有很多问题......
我有一个我想始终引用的本地包(而不是 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 更新为新文件名。
希望对某人有所帮助...
对于更新版本的 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 .
这就是你所需要的!
注意:如果您在项目目录中,我相信尾随点不是必需的,但我也认为添加它并没有什么坏处:-)
(我想知道为什么官方文档仍然没有解释这一点......)
在为 CKEditor5 安装自定义构建包时,我遇到了与上述不同的解决方案。
所以我将包上传到应用程序根目录,而不是:
npm add file:./ckeditor5
在我的 package.json 中,包被列为一个文件:
"ckeditor5-custom-build": "file:ckeditor5",
我认为这个答案可能与如何添加本地包的主题有关。
不定期副业成功案例分享
npm install
非常好。