将npm模块安装为自身的devDependency

时间:2015-10-27 13:22:38

标签: node.js npm

假设我已经制作了一个名为 foo 的TDD工具,我想使用 foo v1 来帮助我开发 foo v2

但是当我npm install --save-dev foo@^1.0.0时,npm说“拒绝安装foo作为自身的依赖”。

  1. 为什么npm拒绝这样做?
  2. 我该怎么做?
  3. 我到目前为止的解决方法(以及为什么它们不够好):

    • 解决方法1:只需要使用相对要求直接使用相关脚本,例如require('../lib')(这就是mocha does it的方式,到目前为止我一直在这样做。)

      • 如果您正在使用新版本的模块,添加功能,甚至可能删除旧功能,那么您不仅需要更改测试内容,还需要更改他们的格式,因为你实际上正在使用你正在研究的东西来测试你正在做的事情。如果它坏了,你必须在黑暗中修复它,没有测试来指导你。使用已解决的 v1 API来编写新的v2 API会好得多。
    • 解决方法2:以不同的名称将模块的副本发布到npm,例如“foo-clone”。 (然后你可以将foo-clone安装为foo的devDependency。)

      • 这看起来很混乱,并且误用了npm。无论如何,如果安装一个确切的克隆会起作用,那么npm会有什么危害,允许我安装[旧版本的] foo作为foo的devDependency?

1 个答案:

答案 0 :(得分:2)

以下是解决方法2 的更好替代方案。

让我们假设您只需要在开发的早期阶段就具有这种依赖性。因此,在发布第一个生产就绪版本之前,您将摆脱它,例如,采用mocha解决方案(使用当前稳定版本进行自我测试)。

在这种情况下,您可以临时重命名您的包(即使用-dev对其进行后缀),而不是发布重复的包。

为了保证不会发布此重命名的包,您还可以添加private flag

所以,你的dev package.json看起来像是:

{
  "name": "mytdd-dev",
  "version": "2.0.0-dev",
  "private": true,
  ...
  "devDependencies": {
    "mytdd": "1.x.x",
    ...
  },
  ...
}

然后,当你的软件包准备好第一个版本时,你将删除所有-dev后缀,private标志和开发人员对先前版本的依赖。

此解决方案的唯一问题是您无法将早期开发版本的TDD工具发布到npm(只要您依赖以前的版本)。

  

如果安装一个确切的克隆会起作用,那么在npm中会有什么危害,允许我安装[旧版本的] foo作为foo的devDependency

我认为这是针对循环依赖的安全预防措施。

如果你认为npm应该在devDependenciespublic void addProduct(int id, String name, String type, String brand, int quantity, int day1, int month1, int year1, int day2, int month2, int year2, String company, String name2, String address, int phone_no) { Formatter x = null; try{ FileWriter f = new FileWriter("C:\\Users\\فاطمة\\Downloads\\products.txt", true); x = new Formatter(f); } catch(Exception e) { //System.out.println("NO Database"); } x.format("%d %s %s %s %d %d %d %d %d %d %d %s %s %s %d\n\n\n",id,name,type,brand,quantity,day1,month1,year1,day2,month2,year2,company,name2,address,phone_no); x.close(); } 做例外,这对我来说是合理的,那么你应该将你的建议发布到npm issues tracker