Composer php 如何使用Composer忽略目录?

Composer php 如何使用Composer忽略目录?,composer-php,Composer Php,我想发布一个PHP库,并将其提交,以便通过安装 我的库具有以下结构: lib/ tests/ composer.json README.md 基本上,每当我在项目的composer.json中包含这个库时,我都希望所有内容都被复制,除了tests目录之外,这个目录很麻烦,只有在开发库本身时才需要。否则,这只是浪费空间(尤其是在将项目打包用于生产时) 是否可以从库的composer.json中排除此目录?这在composer中是不可能的。但是,有一些方法可以做到这一点: 当您使用--prefe

我想发布一个PHP库,并将其提交,以便通过安装

我的库具有以下结构:

lib/
tests/
composer.json
README.md
基本上,每当我在项目的
composer.json
中包含这个库时,我都希望所有内容都被复制,除了
tests
目录之外,这个目录很麻烦,只有在开发库本身时才需要。否则,这只是浪费空间(尤其是在将项目打包用于生产时)


是否可以从库的
composer.json中排除此目录?

这在composer中是不可能的。但是,有一些方法可以做到这一点:

  • 当您使用
    --preferredist
    运行update或install命令时,Composer会尝试在github上下载归档文件。您可以将该测试目录放入项目根目录中的
    .gittributes
    文件中,从存档中删除该测试目录:

    Tests/ export-ignore
    
  • Composer将只使用github上的标记。在创建标记时,只需临时删除tests目录也可以做到这一点


自2015年11月11日起,通过

资料来源:


编辑:曲解。上述操作只允许自动加载程序忽略指定的路径,实际上并不会阻止它们在安装时复制到文件系统。

可以通过在
存档
键内的
composer.json
文件中添加排除模式来控制存档创建。有关详细信息,请参阅

给出的示例(从上面的URL引用):

示例将包括
/dir/foo/bar/file
/foo/bar/baz
/file.php
/foo/my.test
,但它将排除
/foo/bar/any
/foo/baz
,以及
/my.test


这样,您就可以获得与
.gittributes
相同的控制,而不必使用Git或影响需要在所述文件中进行不同设置的任何进程。

这可以通过
更新后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 {} +"
    ],
},

太好了,谢谢。
.gittributes
解决方案看起来很有希望。不过,从GitHub下载ZIP不是默认行为吗?@Benjamin否,它从标记而不是ZIP下载代码。您必须使用
——preferreddist
来获取zip(在anser中使用了错误的开关,修复了know)实际上是这样说的:对于稳定版本,composer将默认使用
dist
。感谢指针!我正要将您的答案标记为已接受,但在阅读文档后,看起来这只是将这些文件从自动加载程序中排除:它们仍将存在于存档中。这显然是第一步,但我的最终目标是在从Composer安装时完全删除测试文件,从而减少归档文件的大小。哦,很抱歉,在这种情况下我误解了这个问题:)所以您需要类似于Bower中的“忽略”选项(忽略[array]:生产中不需要的一系列路径,您希望Bower在安装软件包时忽略这些路径。)-我不知道composer中的该功能-您是否在上创建了功能请求?谢谢,我阅读了您链接到的段落,但我无法理解此归档的目标:据我所知,PackageGist不托管包存档;相反,Composer可以通过克隆git repo或从ZIP归档文件(通常是从GitHub下载,我想这只是遵循
.gittattributes
,而不是
Composer.json
)下载包。Composer是否仍然这样做,但最终会在本地删除排除的文件?这是一个非常好的问题,我将进行调查。确保此设置会在Satis运行期间影响包的创建。我不确定是否要从Github下载软件包。@Sven您调查过了吗?我很快就看了一下。我的印象是:Composer既有处理
.gitignore/.gitattributes
文件的代码,也有我上面提到的配置,这表明Composer至少能够在本地处理这两个不同的排除模式源。这将解释为什么Satis也会受到影响,因为它只是编排了已经存在的编写器代码,没有添加太多内容。所以答案似乎是:“如果没有任何外部源的支持,Composer可以在本地排除”。如果Github的ZIP有更多的文件,我怀疑它们是否会被删除。应该注意的是,这只适用于根包。如果包作为依赖项安装,则它将不起作用。以下是相关的GitHub问题:
"scripts": {
    "post-update-cmd": [
        "find vendor/ -type d -regextype posix-extended -iregex '.*/(doc|docs|example|examples|test|tests|tmp)' -print -exec rm -r {} +"
    ],
},