跳到内容
新问题

对这个项目有疑问吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。

单击“注册GitHub”,表示您同意我们的服务条款隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。

已经在GitHub上了?登录到您的帐户

向作曲家更新添加选项以首选当前版本 #6601

关闭
热重分析仪已打开此问题2017年8月10日·16条评论
关闭

向作曲家更新添加选项以首选当前版本 #6601

热重分析仪已打开此问题2017年8月10日·16条评论

评论

@热重分析仪
复制链接

热重分析仪 评论2017年8月10日

在依赖关系更改后(使当前安装的包不再满足当前需求),我希望能够进行所需的更改,而无需进行任何非必需的更改。

例如,我有一个作曲家.json

“要求”:{“foo/foo”:“1.*”,“bar/bar”:“1.*”}

而composer在过去的某个时候已经安装了版本foo/foo1.2和巴/巴版本1.0基于此。从那时起,世界开始前进foo/foo为1.5。我更新了代码,现在它说

“要求”:{“foo/foo”:“1.*”,“bar/bar”:“2.*”,“吊杆/吊杆”:“1.*”}

我想升级巴/巴并安装动臂/吊杆但我不想碰foo/foo因为这不是满足需求所必需的,我想尽量减少被触及的包的数量(以限制下载时间,或使用严格安全策略的项目的代码审查时间,或减少出现新错误的可能性)。目前唯一的方法是作曲家更新--带依赖项bar/bar boom/boom这很尴尬(我需要知道哪些包有不兼容的需求;这是包管理员的工作),不一定是最小的(如果动臂/吊杆取决于foo/foo:1*,然后foo/foo即使不需要也会得到更新)。

其中一个特别常见的用例是使用作曲家合并插件用于管理具有自己库依赖项的扩展/包/捆绑包的框架:其中一个扩展被更新(或添加了一个新的扩展),我希望能够限制作曲家更新不更新框架和其他已安装的扩展所使用的每个库。

如果能有这样的选择,那就太棒了composer更新-首选当前它会尝试将已安装的包保持在当前版本,除非这与另一个要求冲突。(或者,编写器安装当在已经有composer.lock文件的目录中运行时,可以这样做,但它不能满足composer.json的所有要求。有趣的是,这似乎是大多数人所期望的编写器安装要执行的操作。)

@热重分析仪
复制链接
作者

复写的副本@bd808型

@热重分析仪
复制链接
作者

如果你觉得这是一个有用的补充,我可以做这件事,并给我一些建议。

@酒精
复制链接
成员

作曲家更新栏.

@热重分析仪
复制链接
作者

正如我前面所说,作曲家更新将1)进行不必要的更新(如果与一起使用--有依赖关系; 否则会使系统处于崩溃状态);2) 使用起来很麻烦,因为我必须手动收集所有需要更新的库的名称。它不是这里描述的问题的解决方案。

@酒精
复制链接
成员

对不起,但是作曲家更新根本不同于作曲家更新栏所以,要么这里发生了一些沟通错误,要么你需要确保你的例子更加明确。

@热重分析仪
复制链接
作者

我在原始帖子中写道

目前唯一的方法是作曲家更新--带依赖项bar/bar boom/boom这很尴尬(我需要知道哪些包有不兼容的需求;这是包管理员的工作),不一定是最小的(如果动臂/吊杆取决于foo/foo:1*,然后foo/foo即使不需要也会得到更新)。

你能给我点建议让它更明确些吗?一个真实的例子会有帮助吗?

@酒精
复制链接
成员

我是在回复你的最新评论,其中指出:

正如我前面所说,作曲家更新将1)进行不必要的更新

@酒精
复制链接
成员

但我不知道该怎么做

composer更新--带有依赖项条形图/条形图

进行不必要的更新。它只更新指定的包及其依赖的任何内容。

@达维德巴拉特
复制链接
贡献者

@酒精
根据描述:

如果boom/boom依赖于foo/foo:1.*,那么即使不需要它,foo/foo也会得到更新

也就是说

作曲家更新--带有依赖项boom/boom

将更新已安装的foo/foo1.21.5自从foo/foo是的要求动臂/吊杆。然而,它确实如此需要更新,因为1.2满足动臂/吊杆的要求1.*。这会导致不必要的更新@热重分析仪试图避免(因为在我们的例子中,任何库的更新都必须被明确审查)。

我唯一能想到的解决方法是:

作曲家更新--带依赖项boom/boom--dry-run

并收集要更新的内容的列表,然后手动列出缺少的所有内容:

作曲家更新吊杆/吊杆干草/干草

这将阻止foo/foo不被更新。

但作为@热重分析仪说。。。这太令人讨厌了。

@酒精
复制链接
成员

所以,听起来更像是你想要某种版本固定机制。

@达维德巴拉特
复制链接
贡献者

@酒精嗯。。。对。但我觉得那个技工已经存在于锁文件中了?基本上只需要CLI来支持已经锁定的dep,而不是更新它--未锁定选项还是什么?

@达维德巴拉特
复制链接
贡献者

所以--未锁定(或--跳过锁定如果愿意)将跳过锁定文件中的任何内容除非它位于要更新的包的白名单上,或者不在锁文件中。

@酒精
复制链接
成员

酒精 评论2017年10月23日

我还没有这样想过。我可以看出这里的语言/术语是如何模棱两可的。对我来说,锁定文件只是反映了某个时间点上依赖项的状态,并允许对所述状态进行一致的重新安装。虽然锁文件指定了特定的版本,但运行composer update仍会允许这些版本在composer.json中定义的约束范围内更改。

但当我说固定时,我更多地认为它是一个固定的版本约束。现在,当我写这篇文章的时候,我意识到我们在技术上已经支持了这一点,我想,尽管不是以一种非常方便的形式。但实际上,您可以在根composer.json中列出不希望更新的包,只需将其当前特定版本作为约束。

然后,您可以跟踪哪些包可能会被更新,如下所示:

作曲家已过时

看见作曲家过时--帮助适用于所有选项

@达维德巴拉特
复制链接
贡献者

@酒精正确的。那将是另一个工作区,但不是很方便。我看到很多项目都是这样做的,但我想,锁定作曲家.json有点违背了使用锁文件的目的。这还意味着根包必须列出每个依赖包并保持该列表为最新。:(锁文件已经为我们做了这件事。

理想情况下优先锁定(或优先电流的)中的配置作曲家.json带有CLI选项(因此它与首选最低更稳定在某种程度上)。我认为大多数人都希望作曲家升级包,如果绝对必要,但我也可以抛出异常并列出必须更新的包(通过将其添加到要更新的包的白名单中),在这种情况下,选项是未锁定而不是优先锁定.

@酒精
复制链接
成员

我不确定我们将如何实现这一点。这是一个非常特殊的要求/边缘案例。

采用以下工作流有什么问题:

//确定包已过期作曲家过时--直接//尝试只更新那些(假设foo/bar可用:1.2.0=>1.4.0)作曲家更新foo/bar//如果包没有更新到预期的版本//由于依赖关系,您没有白名单(假设您得到了foo/bar 1.3.0)composer为什么不foo/bar 1.4.0//使用所需依赖项重新运行更新作曲家更新foo/bar其他/dep

@达维德巴拉特
复制链接
贡献者

你说得对。。这不是问题。

以下是我完成的测试,但无法实现。作曲家已经默认情况下尊重锁定文件。

但让我们用一个真实的例子。

让我们开始一个新项目:

$composer需要条令/dbal--首选最小值将版本^2.6用于条令/dbal./composer.json已创建使用包信息加载作曲家存储库更新依赖项(包括require-dev)包操作:7次安装,0次更新,0次删除-安装distribute/lexer(v1.0):下载(100%)-安装条令/屈折符(v1.0):下载(100%)-安装条令/集合(v1.0):下载(100%)-安装条令/缓存(v1.0):下载(100%)-安装条令/注释(v1.0):下载(100%)-安装原则/通用(v2.7.1):下载(100%)-安装条令/dbal(v2.6.0):下载(100%)条令/dbal建议安装symfony/console(对于SQL执行和文件导入等有用的控制台命令)写入锁定文件生成自动加载文件

我们将更新一些dep以防止版本冲突:

$composer更新原则/缓存原则/集合使用包信息加载作曲家存储库更新依赖项(包括require-dev)包操作:0次安装,2次更新,0次删除-更新条令/缓存(v1.0=>v1.7.1):从缓存加载-更新条令/集合(v1.0=>v1.5.0):从缓存加载写入锁定文件生成自动加载文件

稍后,让我们添加一个新包没有更新条令/注释:

$作曲家需要条令/形式:^2.5.12./composer.json已更新使用包信息加载作曲家存储库更新依赖项(包括require-dev)包操作:6次安装,0次更新,0次删除-安装psr/log(1.0.2):从缓存加载-安装symfony/debug(v3.3.10):从缓存加载-安装symfony/polyfill-mbstring(v1.6.0):从缓存加载-安装symfony/console(v3.3.10):从缓存加载-安装条令/实例化器(1.1.0):从缓存加载-安装条令/表单(v2.5.12):下载(100%)symfony/console建议安装symfony/event-dispatcher()symfony/console建议安装symfony/filesystem()symfony/console建议安装symfony/process()条令/orm建议安装symfony/yaml(如果您想使用yaml元数据映射驱动程序)写入锁定文件生成自动加载文件

现在让我们换一种方式试试。。。让我们重新开始(清除目录)

$composer需要条令/dbal--首选最小值将版本^2.6用于条令/dbal./composer.json已创建使用包信息加载作曲家存储库更新依赖项(包括require-dev)包操作:7次安装,0次更新,0次删除-安装distriction/lexer(v1.0):从缓存加载-安装条令/拐点(v1.0):从缓存加载-安装条令/集合(v1.0):从缓存加载-安装条令/缓存(v1.0):从缓存加载-安装条令/注释(v1.0):从缓存加载-安装原则/通用(v2.7.1):从缓存加载-安装条令/dbal(v2.6.0):从缓存加载条令/dbal建议安装symfony/console(对于SQL执行和文件导入等有用的控制台命令)写入锁定文件生成自动加载文件
$composer更新原则/缓存原则/集合使用包信息加载作曲家存储库更新依赖项(包括require-dev)包操作:0次安装,2次更新,0次删除-更新条令/缓存(v1.0=>v1.7.1):从缓存加载-更新条令/集合(v1.0=>v1.5.0):从缓存加载写入锁定文件生成自动加载文件

这给了我们这个作曲家.json

{“要求”:{“条令/dbal”:“^2.6”}}

现在让我们手动编辑它:

{“要求”:{“条令/dbal”:“^2.6”,“条令/形式”:“^2.5.11”}}

并更新包。。。

$composer更新原则/orm使用包信息加载作曲家存储库更新依赖项(包括require-dev)包操作:6次安装,0次更新,0次删除-安装psr/log(1.0.2):从缓存加载-安装symfony/debug(v3.3.10):从缓存加载-安装symfony/polyfill-mbstring(v1.6.0):从缓存加载-安装symfony/console(v3.3.10):从缓存加载-安装条令/实例化器(1.1.0):从缓存加载-安装原则/形式(v2.5.12):从缓存加载symfony/console建议安装symfony/event-dispatcher()symfony/console建议安装symfony/filesystem()symfony/console建议安装symfony/process()条令/orm建议安装symfony/yaml(如果您想使用yaml元数据映射驱动程序)写入锁定文件生成自动加载文件

无论是哪种方式,都会给我们留下过时的信息:

$composer已过时条令/注释v1.0 v1.5.0 Docblock注释解析器条令/通用v2.7.1 v2.8.1条令项目通用库条令/dbal v2.6.0 v2.6.2数据库抽象层条令/屈折符v1.0 v1.2.0关于大小写和单数/复数规则的常见字符串操作。distribution/lexer v1.0 v1.0.1基本库,用于可以在Top-Down递归下降分析器中使用的lexer。

但让我们更进一步,尝试更新过时的直接包@酒精建议:

$composer更新--root-reqs使用包信息加载作曲家存储库更新依赖项(包括require-dev)包操作:0次安装,1次更新,0次删除-更新条令/dbal(v2.6.0=>v2.6.2):从缓存加载写入锁定文件生成自动加载文件

无需更新注释:

$composer已过时条令/注释v1.0 v1.5.0 Docblock注释解析器条令/通用v2.7.1 v2.8.1条令项目通用库条令/屈折符v1.0 v1.2.0关于大小写和单数/复数规则的常见字符串操作。distribution/lexer v1.0 v1.0.1基本库,用于可以在Top-Down递归下降分析器中使用的lexer。

如果它抛出了错误,我们只能将抛出错误的包更新为@酒精建议。我的意思是美好的(imho)如果它能自动为你做到这一点,但我想说,拥有它真是太好了。解释/培训其他开发人员如何做到这一点似乎有点棘手(给他们一个命令会容易得多)。但在大多数情况下,使用CLI的工作方式完全符合预期(除非出现错误,您应该更新这些包)。

因此,对于希望更新尽可能少的包的项目来说,这是一条通用规则。。。我会说:当需要或更新时,总是将包列入白名单。

任何其他问题@热重分析仪?

免费注册 在GitHub上加入此对话.已经有帐户了吗?登录以发表评论
标签
还没有
项目
还没有
开发

没有分支或拉请求

3名参与者