你如何处理删除npm包版本的人?

时间:2016-02-05 12:27:27

标签: npm

今天我发现我的应用依赖的npm包版本Babel 6.0.15已从npm删除。

这导致新PC上的编译失败,我不得不手动找到它最接近的可用版本,并且所有级联版本都会更改它对相关软件包的影响。

处理npm包的最佳方法是什么,现在我知道他们可以随时丢失?

  • 您是否将node_modules文件夹检入源代码管理?
  • npm是否有关于创作者可以删除哪些版本(主要,次要等)的规则,哪些更“长期支持”并且必须保留?
  • 当你在新电脑上'npm update'失败时,你如何在本地获取npm通知你,而不是默默地失败?

1 个答案:

答案 0 :(得分:0)

在考虑了这一段时间后,我写了blog post总结了我认为最佳做法。转载如下:

<强>摘要

  • 指定所有npm模块的确切版本,例如“alt”:“0.17.8”
  • 将node_modules文件夹提交到源代码管理
  • 不要使用DefinitelyTyped或任何其他外部库Typescript定义工具

<强>为什么吗

其中一些原则可能会引起争议,所以这是我的理由:

指定所有npm模块的确切版本

Semver(语义版本控制)表示只有在主要版本发生变化时才会发生重大变化。所以你应该只能说“alt”:“0.17”

但是我在实践中发现即使修补程序更改(错误修正)也可能会破坏您的应用程序 - 因为依赖这些库的库通常期望特定版本中的某些微小行为不会改变。因此,为了使特定库的所有特定版本都能工作,它们需要依赖其他库的精确版本。

将node_modules文件夹提交到源代码管理

我首先假设所有版本的着名npm库都会无限期地保留在那里。但后来我发现创建者经常从npm中删除旧版本的软件 - 然后打破了为应用程序配置的确切版本号依赖关系的级联链。

是的,提交你所有的npm库会占用你的存储库中的空间,但它们毕竟是文本文件,而不是.DLL,因此它们会被压缩得非常小。另一种选择是有一天根本无法在新计算机上编译您的应用程序,因为库已从npm完全删除。

不要使用DefinitelyTyped或任何其他外部库Typescript定义工具

为您使用的外部工具提供编译错误真是太好了。但我发现它不值得付出努力,因为:

  • 无法匹配定义文件版本号和npm库版本号,因此您获得的定义与您正在使用的库不同步
  • 他们经常有虫子
  • 你在编译时捕获的类型错误可能会发生在你自己的应用程序中,而不是你如何调用外部库

不要使用外部库的.d.ts文件,而是说:

declare module 'lodash'
{
    let x: any;
    export = x;
}

或者在Typescript 1.8之后使用-allowJS标志。