我有一个本地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
将本地包链接到项目中一样简单。