强制 PHP 作曲家创建本地存储库的相对而非绝对符号链接
Posted
技术标签:
【中文标题】强制 PHP 作曲家创建本地存储库的相对而非绝对符号链接【英文标题】:Force PHP composer to create relative, not absolute, symlinks of local repositories 【发布时间】:2020-09-05 10:46:51 【问题描述】:我有一个 docker 容器,其主机目录映射如下 - /app(项目本身)和 /packages(本地依赖项)。然后我有 /app/composer.json 文件,我在其中定义了驻留在 /packages 中的本地存储库,例如这个
"require":
"myvendor/mypackage": "^1.0",
,
"repositories": [
"type": "path",
"url": "./../packages/mypackage"
]
问题是,在运行 composer install/update 后,它会使用绝对路径对我的包进行符号链接,因此 /app/vendor/myvendor/mypackage 目录被符号链接为 /packages/mypackage。虽然从作曲家的角度来看这是可行的,但我更希望它是一个相对的符号链接 - ../../../packages/mypackage - 因为否则我的 IDE除非我手动更改符号链接路径,否则无法索引 mypackage 源代码(我的 Ubuntu 主机上的绝对路径与 docker 容器内的绝对路径不同)。我正在寻找作曲家的配置选项来强制绝对/相对但没有运气。有什么办法可以完成我想要的,我错过了什么吗?
【问题讨论】:
我是否正确将此问题解释为“如何配置我的 IDE 以包含用于搜索和探索的第三方包源代码?” .相对于绝对的 mumbo jumbo 看起来像是 xy 问题meta.stackexchange.com/questions/66377/what-is-the-xy-problem 为什么不按通常的方式安装软件包?为什么不使用url
路径指向正确安装的路径?
@NicoHaase 我以通常的方式安装它们。我也知道我可以在 IDE 中显式添加源路径。正如我在另一条评论中所写 - 这里的问题是 - 是否可以强制作曲家使用相对路径而不是绝对路径创建本地供应商的符号链接
看来你在这里过于复杂了。在本地,开发时,在您的机器上运行composer install
。路径会很好,您将能够按预期进行开发。在任何其他环境(容器、不同的主机)上,只需再次运行 install
以使项目处于有效状态。您通常不会遇到此问题,并且可以将整个 vendor
视为“人工制品”,但本地存储库主要用于开发,因此这些期望不再适用。
我感受到你的痛苦。我有同样的问题。我在容器和本地机器中使用相同的绝对路径安装“myvendor/mypackage”源目录。它对我有用。据我了解,作曲家检查你的包和你的依赖包之间的公共路径,这个公共路径是'/'。在这种情况下,compose 建立了绝对链接而不是相对链接。这有点难看,但我无法强制作曲家创建相对链接。
【参考方案1】:
作为符号链接的替代方案,您可以将 composer 配置为镜像本地路径,而不是创建符号链接,使用 COMPOSER_MIRROR_PATH_REPOS=1
环境变量。
https://getcomposer.org/doc/03-cli.md#composer-mirror-path-repos
这可能不是您真正需要的,因为本地包中的更改不会自动传播,需要再次运行 composer install 才能再次镜像本地路径。
【讨论】:
以上是关于强制 PHP 作曲家创建本地存储库的相对而非绝对符号链接的主要内容,如果未能解决你的问题,请参考以下文章
php开发中,取绝对路径$_Site_Roots = substr(dirname(__FILE__), 0, -4)