【问题标题】:How to develop with symlinked composer package, but build from a vcs repository?如何使用符号链接的作曲家包进行开发,但从 vcs 存储库构建?
【发布时间】:2020-02-15 09:28:54
【问题描述】:

在重构遗留代码时,我尝试在编写器包上工作,同时在使用该包的项目上工作。

Composer 允许我添加本地路径存储库以检索正在开发的包,并将 symlinking this package 添加到我的项目中。

<composer.json excerpt>
"repositories": [
    {
        "type": "path",
        "url": "../my-package/",
        "options": {
            "symlink": true
        }
    }
],

...
"require": {
    "my/package": "@dev"
}

然后我做

composer update my/package --prefer-source

哪些符号链接很好。但是,当在 CI 服务器上构建我的项目时,我希望项目从远程 git 存储库中检索包,这就是我将 vcs 部分添加到我的composer.json 的原因。

    {
        "type": "vcs",
        "url":  "git@bitbucket.org:my/package.git"
    }

但是,在通过composer install 构建期间,它仍然尝试在本地检索包,这在 CI 服务器上当然不可用。我猜是因为我的composer.lock 明确表示该包是从路径中检索的。 如何让它在本地和 CI 服务器上顺利运行?我似乎缺乏一个像样的工作流程。

到目前为止我尝试了什么:

  • 再次添加my/package 作为开发包,但显然composer.json 会自动从非开发包中删除。另外,我不知道如何告诉作曲家将路径存储库用于开发需求,将 vcs 存储库用于无开发需求。

【问题讨论】:

  • 如果问题确实出在 composer.lock 中,我会在您的 CI 服务器上执行期间重建 composer.lock 作为第一步。
  • 感谢您的输入 Alex,但您所说的“将重建 composer.lock”是什么意思? Afaik composer.lock 确保我使用相同的版本,不会意外引入任何更新。
  • 我的意思是您可以“动态”更改您的 composer.lock 以使用 bash 脚本从远程强制检索包,然后运行 ​​composer install
  • 谢谢亚历克斯,但这对我来说似乎很棘手。

标签: php git composer-php


【解决方案1】:

经过大量小时寻找合适的工作流程后,我找到了一个。希望对你有帮助。

由于 repository-dev(就像 repository 的 require-dev 一样)不存在并且不会很快存在(参见this),我们需要创建两个composer.json 文件。假设我们称第二个为composer-dev.json。我认为您应该提交两者并保持最新状态。要告诉作曲家使用composer-dev.json,您需要在每个作曲家命令前面加上COMPOSER=composer-dev.json。为了说明,请参见:

composer.json

{
    "repositories":[
        {
            "type": "vcs",
            "url": "{repo}"
        }
    ],
    "require": {
        "vendor/package": "{version}",
    }
}

作曲家-dev.json

{
    "repositories":[
        {
            "type": "path",
            "url": "path/to/your/package",
            "options": {
                "symlink": true
            }
        }
    ],
    "require": {
        "vendor/package" : "{version}",
    }
}

如您所见,composer.json 包含“vcs”存储库,composer-dev.json 包含“路径”存储库。

初始化您的应用程序并开始开发:

COMPOSER=composer-dev.json composer update

Composer 创建了供应商目录并将您的包文件夹符号链接到vendor/package。它还创建了一个 composer-dev.lock 文件,您应该提交该文件以进行部署。

安装新包:

COMPOSER=composer-dev.json composer require vendor/package

记住composer.json 必须是最新的,所以你必须把所有的新行放进去。

构建您的应用程序:

COMPOSER=composer-dev.json composer install

应该扔给你:

[RuntimeException]
Source path "path/to/your/package" is not found for package vendor/package

现在你可以运行了:

composer update --no-dev vendor/package

或者如果您需要特定版本:

composer update --no-dev vendor/package:{version}

请注意,最后一个命令前面有 no COMPOSER=composer-dev.json,因为我们使用 composer.json 来使用我们的 vcs 存储库。最后一个命令也将安装所有丢失的包。

希望对你有用!

【讨论】:

  • COMPOSER 环境变量的非常酷的技巧。谢谢。
猜你喜欢
  • 2018-04-24
  • 2021-07-12
  • 2017-01-28
  • 2020-09-05
  • 2011-12-19
  • 2015-03-03
  • 1970-01-01
  • 2015-10-22
  • 2023-03-10
相关资源
最近更新 更多