我想发布一个PHP库并将其提交到Packagist上,以便通过Composer安装它。
我的库具有以下结构:
lib/
tests/
composer.json
README.md
基本上,每当我将这个库包含在项目的composer.json
中时,我希望复制除tests
目录之外的所有内容,该目录很麻烦,仅在开发库本身时才需要。否则只是浪费空间(尤其是在打包项目以进行生产时(。
是否可以从库的composer.json
中排除此目录?
作曲家中是不可能的。但是,有一些方法可以做到这一点:
当您使用
--prefer-dist
运行更新或安装命令时,Composer 会尝试在 github 上下载存档。您可以通过将其放在项目根目录中的.gitattributes
文件中,从存档中删除测试目录:Tests/ export-ignore
作曲家将只使用 github 上的标签。只需在创建标签时临时删除测试目录也可以解决问题。
archive
键内的composer.json
文件中添加排除模式来控制存档创建。有关详细信息,请参阅 https://getcomposer.org/doc/04-schema.md#archive。
给出的例子(引用自上面的 URL(:
{
"archive": {
"exclude": ["/foo/bar", "baz", "/*.test", "!/foo/bar/baz"]
}
}
该示例将包括
/dir/foo/bar/file
、/foo/bar/baz
、/file.php
、/foo/my.test
,但它将排除/foo/bar/any
、/foo/baz
和/my.test
。
这样,您就拥有了与.gitattributes
大致相同的控制权,而不必使用 Git 或影响任何需要在所述文件中进行不同设置的进程。
自 2015 年 11 月 11 日起,这可以通过 https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps
来源: https://github.com/composer/composer/issues/4456#issuecomment-155825777
编辑:误解。以上仅允许自动加载器忽略指定的路径,实际上并没有阻止它们在安装时被复制到文件系统。
这可以通过scripts
键中的post-update-cmd
composer.json
文件来自动执行:
"scripts": {
"post-update-cmd": [
"rm -rf vendor/aura/intl/tests vendor/cakephp/cakephp/tests"
],
},
或者使用模式删除目录:
"scripts": {
"post-update-cmd": [
"find vendor/ -type d -regextype posix-extended -iregex '.*/(doc|docs|example|examples|test|tests|tmp)' -print -exec rm -r {} +"
],
},