2017-04-18 47 views
0

鉴于作曲家可以composer.json文件virtual packages in provide部分,如何版本的虚拟包的管理,如果没有人认为责任工作?作曲:虚包中提供部分

我的意思是,如果任何人都可以创建“邪恶”包装说明它provide -s特定的虚拟软件包(其中有没有回购任何地方),比他们可以指定自己喜欢的任何版本。这可能与其他“好”包相冲突吧?

回答

1

从我的经验,这种“虚拟包”功能并没有得到广泛的应用,它肯定有它的缺点,由于它目前正在执行的方式。

如果你看一看this search result上Packagist,你会看到三大包是psr/log(真正的接口封装),psr/log(其他两个实包使用虚拟包,但在错误的方式)和psr/log-implementation(大量包使用,包括monolog/monolog)。

这个例子说明人们会误解这个功能并做错误的事情。你不能提供psr/log,因为这是一个真正的包,有一个真正的接口定义。它使需要psr/log更有意义,同时也提供它。

还发现正确的,有决定哪些应该存在一个虚拟包的版本,更不用说它应该存在的虚拟软件包名没有中央实体。这并不是什么大问题,因为决定使用real包的名称是以同样的方式完成的:一位开发人员想到一个名字,就这些。这个程序不大可能造成非自愿冲突,因为通常Github帐户名称被用作供应商名称,而Github已经使它们变得独一无二。由于Composer用于命名软件包的通用结构,因此恶意冲突在现实世界中并不存在,因为Jordi has pointed out in his blog

返回到虚拟包功能:有两篇博客文章讨论它。

第一explains using this feature与上述虚拟psr/log-implementation包的例子。我不会在这里复制那个类似教程的文本。

second (linked and replied to at the end of the first) discusses what's bad关于虚拟包的整个方法。

的一些要点:

1)严格来说(如,将代码编译),从库本身的代码并不需要一个包,提供psr/log-implementation。它只需要LoggerInterface(恰好在psr/log包中)。

4)psr/log-implementation,或者任何虚拟包就此而言,是作为一个包非常有问题的。这个虚拟包没有定义。 [...]

5)有一天,有人可能会决定引入另一个虚拟包,称为the-real-psr/log-implementation(他们可以很容易地做到这一点,对吧?)。这样的软件包可以与现有的psr/log-implementation软件包完全交换,但为了有用,每个现有的PSR-3兼容记录软件包都需要在其提供部分中提及该虚拟软件包。 [...]

由于所有这些问题和不确定因素都存在于优秀的软件包中,所以他们并没有真正使用这个功能,这并不奇怪。

但是,您不能以您在问题中概述它的方式滥用它以用于坏事。是的,任何包可以声明它提供任何其他包。但就像psr/log发生的那样,有一个声明它提供了另一个包的包并不会奇迹般地让每个人下载该包。它的工作方式是一个软件包声明它提供了另一个软件包,并且通过要求该软件包,该虚拟软件包也包含在内,并且将满足其他软件包对虚拟软件包的依赖关系。

但不要求提供东西的包装将离开等式的一切。

为了包含坏的软件,有人必须require它。这最好是作为一个无辜看图书馆的间接依赖,并需要一个毫无戒心的开发人员的帮助,它会在没有正确审阅它的情况下积极地提取这些代码。

这可能是我的一切中心点:如果你拉某人的代码到自己的项目,一定要明白,这段代码的功能通过审查它(这不仅是恶意的东西,但也基本代码质量,因为有一天你可能会被迫调试一个问题),或者确保你可以相信这个源码足以不会对你做坏事。但是,您自己的代码库不受您不需要的软件包的影响(最后一个具有此类影响的bug正在处理replace信息,但我现在没有发现该问题)。

+0

(part 1/2)谢谢@Sven花时间向我解释这个问题。但是它仍然不能为我的“版本”问题提供合理的答案。你提到了软件包的名称,但我认为这些与虚拟软件包的版本不相上下。 仅仅因为对于一个包来说,如果你愿意的话,就有一个单一的存储库 - 单个负责人。 – meridius

+0

(第2/2部分)另一方面,任何人都可以提供他们可以想到的任何虚拟包(在任何版本中)。没有人明确地管理所述虚拟包的生命周期。即使一个人首先“提供”了包裹,并且可以被视为一个维护人员,任何人都可以在另一个版本中提供该包裹,这样就会破坏未来包裹发展的任何_maintainers'_计划。 – meridius

+0

你说得对,我忽略了“版本”部分。但正如你自己所说的,版本与名称一样有问题。版本是由任何提供版本虚拟包的软件包创建的。然而,软件包的工作方式是应用程序需要一个lib,它需要一个版本范围内的虚拟包(比如'psr/log-implementation),另一个库提供这个版本。通过为虚拟包提供更高兼容的版本,没有其他软件包可以被视为更好的选择。 – Sven