使用 PHP Composer 开发本地包,然后在部署时复制它



我有一个本地PHP项目(一个网站(,我想使用我制作的另一个项目(一个小的Web框架(作为网站项目的Composer包。 我正在同步开发它们,但希望将它们保留为单独的项目;当我部署网站时,我想使用 Composer 将框架项目作为一个包安装,就像我使用 Guzzle 或任何其他常见的 Composer 包一样。

网站项目具有以下composer.json

{
"repositories": [
{
"type": "path",
"url": "/local/path/to/framework/package"
"options": {
"symlink": true
}
}
],
"require": {
"my/framework": "dev-master",
"guzzlehttp/guzzle": "6.3.3"
}
}

/local/path/to/framework/package/composer.json我有:

{
"name": "my/framework",
"description": "A tiny framework.",
"autoload": {
"psr-4": {
"MyFramework\": "src"
}
}
}

我运行php composer.phar update,它在我的网站项目中设置了一个指向框架包的符号链接。 如果我更新框架中的代码,它立即可用于网站代码。 这太好了。

但是,稍后我想将网站项目部署到我的 Web 服务器。 对于干净部署,我有一个部署脚本,该脚本导出网站 git 存储库相应分支的存档副本,然后运行php composer.phar install以确保安装了所有正确的包。 使用上述配置,部署脚本会创建一个指向框架包的符号链接,当部署工件被压缩并 scp 输出到 Web 服务器时,这显然是不好的。

如果我删除上面的symlink选项,那么每次对框架包进行任何更改时,我都必须运行php composer.phar update,这很烦人,因为我正在同时开发包。 但是,在部署时,包被复制进来,而不是符号链接;这有利于部署,除了它总是在master分支中复制(因为我在composer.json中指定了dev-master(。

有没有办法设置 Composer,以便我可以方便地使用本地符号链接包进行开发,但让部署脚本获得框架包的干净副本,而不必每次要部署时都更改composer.json

我还尝试将存储库类型更改为vcs而不是path,但随后 Composer克隆了框架包存储库,无论是在开发还是部署期间,我真的不需要在本地vendor/树中克隆存储库。 我只是希望在开发过程中能够有一个符号链接的树(这让我得到即时更新(,并安装一个干净的包进行绘制。

我可能不得不"正确"开发框架项目,即作为我用实际发布版本号标记的 Composer 包,然后更新我的网站项目以在部署时使用特定版本。 不过,我仍然没有找到最简单的方法。

您可以使用 Composer Studio 插件。

它使用单独的文件进行配置,并允许您在开发中使用符号链接,并在生产部署中安装常规 Composer,而无需触摸composer.json

有了它,您的网站composer.json将看起来像一个常规文件:

{
"require": {
"my/framework": "dev-master",
"guzzlehttp/guzzle": "6.3.3"
}
}

并在项目的根目录中studio.json,内容如下:

{
"version": 2,
"paths": [
"/local/path/to/framework/package"
]
}

您可以告诉插件在哪里可以找到my/framework。然后,Studio 将从提供的路径对包进行符号链接。

要进行常规安装,只需删除或重命名studio.json,删除vendor文件夹和composer.lock文件,然后在部署时再次运行安装。

我做了一个作曲家插件,以便更容易地测试包。

它不需要配置文件,不需要更改 composer.json,也不会更改composer update的升级行为

https://github.com/SanderSander/composer-link

它的工作原理就像调用composer link ../path-to-package将本地包链接到项目中一样简单。

相关内容

  • 没有找到相关文章

最新更新