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

有什么简单的方法吗?


当前回答

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

我有一个本地包,我想总是引用(而不是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个目的:

避免了常见错误(至少在angular npm项目中)”指数。Ts不是编译的一部分。”-因为它指向已构建的(dist)文件夹。 添加一个preinstall步骤来构建引用的npm客户端包,以确保构建了依赖包的dist文件夹。 避免了本地引用tar.gz文件可能会被npm缓存,而不会在主项目中更新,而无需进行大量的清理/故障排除/重新构建/重新安装。

我希望这是清楚的,并帮助一些人。

tar.gz方法也可以工作。

NPM install(文件路径)也可以工作。

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

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

使用上述解决方案的常规开发流程还会出现额外的错误,因为npm的本地文件版本控制方案非常糟糕。如果你的依赖包频繁更改,整个方案就会崩溃,因为npm会缓存你的项目的最后一个版本,然后当SHA散列与你的包锁中保存的内容不再匹配时就会崩溃。Json文件,以及其他问题。

因此,我建议使用*。TGZ方法,对每个更改都进行版本更新。这需要做三件事。

第一:

对于你的依赖包,使用npm库"ng-packagr"。它会自动添加到由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

现在,只需要更新:

"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 install提供一个<folder>参数,参数应该指向本地文件夹而不是包名:

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 pack + package.json

这对我来说很管用:

步骤1:在模块项目中,执行npm pack:

这将构建一个<package-name>-<version>.tar.gz文件。

步骤2:将文件移动到使用者项目

理想情况下,你可以把所有这些文件放在你的消费者-项目根目录下的tmp文件夹中:

步骤3:在package.json中引用它:

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

第四步:安装包:

NPM安装或NPM I或纱线

现在,您的包可以在您的消费者项目的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个目的:

避免了常见错误(至少在angular npm项目中)”指数。Ts不是编译的一部分。”-因为它指向已构建的(dist)文件夹。 添加一个preinstall步骤来构建引用的npm客户端包,以确保构建了依赖包的dist文件夹。 避免了本地引用tar.gz文件可能会被npm缓存,而不会在主项目中更新,而无需进行大量的清理/故障排除/重新构建/重新安装。

我希望这是清楚的,并帮助一些人。

tar.gz方法也可以工作。

NPM install(文件路径)也可以工作。

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

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

使用上述解决方案的常规开发流程还会出现额外的错误,因为npm的本地文件版本控制方案非常糟糕。如果你的依赖包频繁更改,整个方案就会崩溃,因为npm会缓存你的项目的最后一个版本,然后当SHA散列与你的包锁中保存的内容不再匹配时就会崩溃。Json文件,以及其他问题。

因此,我建议使用*。TGZ方法,对每个更改都进行版本更新。这需要做三件事。

第一:

对于你的依赖包,使用npm库"ng-packagr"。它会自动添加到由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

现在,只需要更新:

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

希望这能帮助到某人…