使用npm安装本地模块?

时间:2011-11-11 01:53:30

标签: javascript node.js npm packages npm-install

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

这是一种简单的方法吗?

8 个答案:

答案 0 :(得分:417)

来自npm-link documentation

在本地模块目录中:

$ cd ./package-dir
$ npm link

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

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

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

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

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

答案 1 :(得分:330)

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

npm install /path

答案 2 :(得分:129)

自从同一个人提问和回答后,我会添加npm link作为替代方案。

来自docs:

  

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

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"
  }

答案 3 :(得分:37)

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

祝你好运...

答案 4 :(得分:4)

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

在这种情况下,npm像这样设置myproject的{​​{1}}:

node_modules/

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

因此,我们要么需要一种方法来告诉节点在寻找/local/myproject/node_modules/时不解析该符号链接,要么我们需要一种方法来告诉npm安装 copy < foo中使用文件依赖项语法时,foo中的/ em>。不幸的是,我也没有找到任何一种方法:(

答案 5 :(得分:4)

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

我有一个本地软件包,我希望始终引用该本地软件包(而不是npm链接),因为它不会在该项目外部使用(暂时),也不会上传到npm存储库中以作为以下用途的

我还需要它在Windows和Unix上运行,因此符号链接并不理想。

指向(npm软件包)的tar.gz结果适用于相关的npm软件包文件夹,但是,如果要更新软件包,这会导致npm缓存出现问题。即使您删除了node_modules并为您的主项目重新安装了npm-install,更新时也不总是从引用的npm软件包中引入新的软件包。

所以..这对我来说很好!

主项目的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",
    ...
  }

这实现了三件事:

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

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

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"
  },

引用另一个项目的项目会添加一个预安装步骤,以确保从属项目是最新的并在构建自身之前进行了重建:

  "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文件-版本,然后引用新文件名即可。

希望可以帮助某人...

答案 6 :(得分:0)

缺少主要财产?

就像以前的人回答npm --save ../location-of-your-packages-root-directory一样。 ../location-of-your-packages-root-directory必须具有两点才能起作用。

1)package.json在该目录中指向

2)必须设置main中的package.json属性,例如"main": "src/index.js",,如果../location-of-your-packages-root-directory的条目文件是../location-of-your-packages-root-directory/src/index.js

答案 7 :(得分:0)

我实际上还没有尝试过,但是如果您将模块发布在本地npm存储库(https://www.npmjs.com/package/local-npm)中,则可以使用https://docs.npmjs.com/misc/scope#associating-a-scope-with-a-registry将其安装到项目中通常在不更改默认范围存储库软件包的情况下使用该专用特殊本地范围进行工作。

编辑:这种方法实际上并不是原始问题发布者似乎要问的问题,尽管可能存在某些解释歧义的领域,但该答案可能会解决。我知道SO样式不是很好,但是我的意思是最终尝试一下。