我是 PHP 世界中的
composer
新手。
我正在尝试创建一个包
Foo
,其中包含包 Bar
作为依赖项。 Bar
可通过 packagist
获得。不过,Foo
不需要 Bar
的任何 PHP 代码,只需要一些资源。这些资产可能会随着 Bar
的每个新版本的发布而发生变化,因此与 Foo
一起发布它们实际上并不可行。
Foo
不应该单独运行(尽管它可以),但它应该被其他包用作依赖项 - 例如 Yada
。这就是我的麻烦开始的地方。
那么,我们有
Bar
有一些资产。Foo
使用 Bar
作为依赖项,例如带有 composer.json
,相关部分看起来像{
"name": "foo/foo",
"require": {
"bar/bar": "<some-version>"
}
}
Yada
使用 Foo
作为依赖项,例如带有 composer.json
,相关部分看起来像{
"name": "yada/yada",
"require": {
"foo/foo": "<some-version>"
}
}
我尝试单独安装
Foo
(理论上可以创建一个独立有用的工具)并作为Bar
的依赖项。我希望始终在同一位置创建 vendor
文件夹(相对于我的 Foo
文件)。
但是:
composer install
上运行Foo
,那么vendor/Bar
将被放入Foo
的目录中。composer install
上运行Yada
,那么Foo
和Bar
都会被安装,但是vendor/Foo
和vendor/Bar
将被放入Yada
的文件夹中,所以Bar
的与 1) 相比,文件将位于不同的位置。
请注意,1)并不意味着我已经在composer install
上运行了Yada
,更改为vendor/Foo
并再次运行了composer install
。这意味着,我无法知道我想要使用的资源将放置在与
Foo
的文件相关的位置,可以吗?换句话说:如果 Foo
作为依赖项(或子依赖项或子子.. .)其他一些包?我了解了可以添加到 Bar
文件中的 Foo
脚本。这将允许我将资源复制到与
post-install-cmd
文件相关的预先确定的文件夹中,以便可以引用它们。唉,“仅执行根包的composer.json 中定义的脚本。如果根包的依赖项指定了自己的脚本,Composer 不会执行这些附加脚本。”。换句话说,当您安装
composer.json
作为 Foo
的依赖项时,Foo
脚本将不会运行。“作曲家世界”有针对此类问题的推荐解决方案吗?或者这是否意味着当您想在包中使用 Yada
时,您不仅需要在 post-install-cmd
中使用
Foo
添加它,而且还要添加一个小 require
脚本来复制/移动资产文件是否符合要求?这对于 PHP 项目来说可以接受吗?我不知道这是否值得推荐,但我能够找到解决我的问题的方法:
composer.json
与
post-install-cmd
的关系 - 考虑到它可以用作依赖项或在某些时候可能独立使用 - 我创建了一个简单的函数来从
Foo
开始向上遍历文件树,寻找 Bar
。