【问题标题】:Php composer update without replace the lock filephp composer更新不替换锁文件
【发布时间】:2022-11-02 03:05:47
【问题描述】:

我的作曲家有问题 在VM实例中,安装了php和一些包(在composer.lock文件中列出) 当我尝试在本地安装新包时(我从另一个 VM 复制包文件夹可以通过互联网安装),列出已安装包的旧 composer.lock 将被替换为我安装的仅新包的信息。

步:

我用新包更新 composer.json

{
    "repositories": [
        {
            "packagist": false
        },
        {
            "type": "path",
            "url": "/path/to/artifact/"
        }   
    ], 
    "require": {
        "firebase/php-jwt": "^6.4"
    }
}

然后运行 php composer.phar 更新

new package installed but composer.lock just have only new package(php-jwt) all other contents deleted
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 50 removals
  - Removing cakephp/debug_kit (2.2.9)
  - Removing clue/stream-filter (v1.6.0)
  - Removing composer/installers (v1.12.0)
  - Removing doctrine/instantiator (1.4.1)
  ...
  - Locking firebase/php-jwt (6.4.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Downloading firebase/php-jwt (6.4.0)
  - Installing firebase/php-jwt (6.4.0): Extracting archive
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
No security vulnerability advisories found

我可以做些什么来安装新包和更新(附加)信息到 composer.lock 而不是只添加新包?

更新:我将更新命令更改为要求,结果相同

php composer.phar require /path/to/artifact/

【问题讨论】:

  • 更新锁意味着重写它。锁的概念中没有附加或类似的东西。
  • 感谢@hakre 的信息,您对安装新软件包和更新锁定文件有任何想法吗?

标签: php composer-php


【解决方案1】:

命令

composer update

读取composer.json 文件并更新/降级/删除/添加require 部分中列表之后的包到可能遵循其规则并避免冲突的最新版本。

在您的情况下,仅指定了firebase/php-jwt,因此仅保留/更新其自身及其依赖项,并删除所有其他包,composer.lock 反映了update 操作后的状态。

要解决此问题,您应该使用包含在 composer.json 文件中的完整包列表,该文件引用最初安装的包,并手动将 firebase/php-jwt 包添加到其中并运行命令:

composer update

或使用命令:

composer require firebase/php-jwt:^6.4

让作曲家将firebase/php-jwt 包添加到composer.json 文件并安装包。

【讨论】:

    【解决方案2】:

    您正在按照配置有效地更新锁定文件,并使用正确的命令 - composer update - 问题仅仅是掌握删除:

    Lock file operations: 1 install, 0 updates, 50 removals
      - Removing cakephp/debug_kit (2.2.9)
      - Removing clue/stream-filter (v1.6.0)
      - Removing composer/installers (v1.12.0)
      - Removing doctrine/instantiator (1.4.1)
      ...
      - Locking firebase/php-jwt (6.4.0)
    Writing lock file
    

    由于作曲家的版本锁定显示除firebase/php-jwt 之外的所有软件包都不得安装并且是/将被删除,这表明您的期望与您实际配置作曲家的内容不匹配。请参阅--dry-run 选项以验证您的更改,然后再应用它们以预先验证您的期望,这样您就可以省去麻烦。

    现在我写道这是“按配置”。那是因为您共享了配置:

    {
        "repositories": [
            {
                "packagist": false
            },
            {
                "type": "path",
                "url": "/path/to/artifact/"
            }   
        ], 
        "require": {
            "firebase/php-jwt": "^6.4"
        }
    }
    

    唯一需要的包是firebase/php-jwt。其他人都去哪儿了?好吧,你没有分享你的问题,所以我只能猜测,我会说你编辑了 composer.json 文件,在这样做的同时,你已经删除了项目的实际要求。

    从备份中恢复原始的composer.jsoncomposer.lock 文件以及vendor 文件夹以恢复项目要求和依赖项。

    不要只是盲目地对这些文件应用更改。如果您处于离线状态,只需复制两个作曲家文件和相应的供应商文件夹即可。

    如果您无法离线并且由于某种原因无法运行大多数 Composer 命令,请阅读以下内容:

    COMPOSER_DISABLE_NETWORK

    如果设置为 1,则禁用网络访问(尽力而为)。这可用于调试或在连接性较差的飞机或星舰上运行 Composer。

    如果设置为 Prime,GitHub VCS 存储库将填充缓存,因此可以使用 1 完全脱机使用。 (ref)

    此外,根据我自己的离线经验,您不必禁用(默认)packagist 存储库,因为 composer 在没有网络并回退到缓存时意识到。

    从您从中获取更新的在线机器复制(准备好的)作曲家缓存,它非常便携。如果您需要专门的调整,例如覆盖默认大小限制,请研究作曲家手册。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2020-04-08
      • 1970-01-01
      相关资源
      最近更新 更多