我有一个下载的模块repo,我想在本地安装它,而不是全局安装在另一个目录?
有什么简单的方法吗?
你只需要提供一个<folder>参数到npm install,参数应该指向本地文件夹,而不是包名:
<folder>
npm install
npm install /path
由于由同一个人提问和回答,我将添加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" }
npm-link文档:
在本地模块目录下:
$ cd ./package-dir $ npm link
在项目的目录下使用模块:
$ cd ./project-dir $ npm link package-name
或者一次性使用相对路径:
$ cd ./project-dir $ npm link ../package-dir
这相当于在上面使用两个命令。
这两种方法(npm link或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/:
myproject
node_modules/
/dev/myproject/node_modules/ foo/ mymodule -> /local/mymodule
当node加载mymodule并执行require('foo')时,node解析mymodule符号链接,然后只在/local/mymodule/node_modules/(及其祖先)中查找foo,但它没有找到。相反,我们希望node在/local/myproject/node_modules/中查找,因为这是我们运行项目的地方,也是foo安装的地方。
mymodule
require('foo')
/local/mymodule/node_modules/
foo
/local/myproject/node_modules/
所以,我们要么需要一种方法告诉节点不在查找foo时解析这个符号链接,要么我们需要一种方法告诉npm在package.json中使用文件依赖语法时安装mymodule的复制。不幸的是,我还没有找到这样做的方法:(
正如之前的人回答的那样,npm i --save ../location-of-your-packages-root-directory。 然而,../location-of-your-packages-root-directory必须有两个东西才能使它工作
npm i --save ../location-of-your-packages-root-directory
../location-of-your-packages-root-directory
package.json在那个目录指向
main属性在package.json中必须设置和工作,例如 "main": "src/index.js",,如果../location-of-your-packages-root-directory的入口文件是../location-of-your-packages-root-directory/src/index.js
main
"main": "src/index.js",
../location-of-your-packages-root-directory/src/index.js
这对我来说很管用:
module project
npm pack
这将构建一个<package-name>-<version>.tar.gz文件。
<package-name>-<version>.tar.gz
consumer project
理想情况下,你可以把所有这些文件放在consumer-project根目录下的tmp文件夹中:
consumer-project
tmp
"dependencies": { "my-package": "file:/./tmp/my-package-1.3.3.tar.gz" }
Install
npm install或npm i或yarn
npm i
yarn
consumer-project's node_modules
祝你好运…
所以我对到目前为止提到的所有解决方案都有很多问题……
我有一个本地包,我想总是引用(而不是npm链接),因为它不会在这个项目之外使用(目前),也不会被上传到npm存储库广泛使用。
我还需要它在Windows和Unix上工作,所以符号链接不是理想的。
指向(npm package)的tar.gz结果适用于依赖的npm包文件夹,但是如果你想更新包,这会导致npm缓存出现问题。当你更新npm包时,它并不总是从引用的npm包中拉入新的,即使你去掉node_modules并为你的主项目重新执行npm-install。
所以. .这对我来说很有效!
主要项目包。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个目的:
我希望这是清楚的,并帮助一些人。
tar.gz方法也可以工作。
NPM install(文件路径)也可以工作。
这都是基于openapi规范生成的客户端,我们希望将其保存在一个单独的位置(而不是对单个文件使用copy-pasta)。
<强> = = = = = = 更新: = = = = = = < / >强
使用上述解决方案的常规开发流程还会出现额外的错误,因为npm的本地文件版本控制方案非常糟糕。如果你的依赖包频繁更改,整个方案就会崩溃,因为npm会缓存你的项目的最后一个版本,然后当SHA散列与你的包锁中保存的内容不再匹配时就会崩溃。Json文件,以及其他问题。
因此,我建议使用*。TGZ方法,对每个更改都进行版本更新。这需要做三件事。
第一:
对于你的依赖包,使用npm库" ng- packagquot;它会自动添加到由OpenAPI 3.0的angular-typescript代码生成器创建的自动生成的客户端包中。
因此,我正在引用的项目有一个“脚本”;包中的部分。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根据文件名的变化来版本基于文件的包。它不会检查包本身中是否有更新的版本。NPM团队表示他们不会修复这个问题,但人们一直在提出这个问题:https://github.com/microsoft/WSL/issues/348 . json
现在,只需要更新:
"version": "1.0.0-build5",
在依赖包的包中。Json文件,然后在主项目中更新对它的引用以引用新的文件名,例如:
"dependencies": { "@com/some-npm-package-angular": "file:../some-npm-package-angular/dist/some-npm-package-angular-1.0.0-build5.tgz", ... }
你会习惯的。只需更新两个包。Json文件-版本然后引用到新的文件名。
希望这能帮助到某人…
对于npm的最新版本(我在macOS Big Sur下使用8.1.3),命令序列甚至更容易…
cd /path-where-your-local-project-is/ npm init
这将要求您提供一些与项目相关的数据,并正确初始化project.json文件。
project.json
一旦完成,你可以安装额外的模块:
cd /path-where-your-local-project-is/ npm install --save-dev some-npm-module .
这就是你所需要的!
注意:我相信如果你在项目目录中,后面的点是不必要的,但我也认为添加它没有坏处:-)
(我想知道为什么官方文件仍然没有解释这一点…)
我遇到了不同的解决方案,而不是上面安装自定义构建包ckedor5。
所以我上传包到应用程序根目录,比:
npm add file:./ckeditor5
在我的包裹里。Json包被列为一个文件:
"ckeditor5-custom-build": "file:ckeditor5",
我认为这个答案可能与如何添加本地包的主题相关。