【问题标题】:How to ignore directories with Composer?如何使用 Composer 忽略目录?
【发布时间】:2013-06-07 14:38:24
【问题描述】:

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

我的图书馆有以下结构:

lib/
tests/
composer.json
README.md

基本上,每当我将这个库包含在项目的composer.json 中时,我都希望复制所有内容,但tests 目录除外,该目录很麻烦,仅在开发库本身时才需要。否则只会浪费空间(尤其是在打包项目以进行生产时)。

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

【问题讨论】:

    标签: composer-php


    【解决方案1】:

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

    • 当您使用--prefer-dist 运行更新或安装命令时,Composer 会尝试在 github 上下载存档。您可以通过将其放在项目根目录中的 .gitattributes 文件中来从档案中删除测试目录:

      Tests/ export-ignore
      
    • Composer 只会使用 github 上的标签。在创建标签时临时删除测试目录也可以解决问题。

    【讨论】:

    • 太好了,谢谢。 .gitattributes 解决方案看起来很有希望。但是,从 GitHub 下载 ZIP 不是默认行为吗?
    • @Benjamin 不,它从标签下载代码,而不是 zip。您必须使用--prefer-dist 来获取 zip(在分析器中使用了错误的开关,已修复)
    • 其实this page 说:对于稳定版本,composer 默认使用dist
    【解决方案2】:

    自 2015 年 11 月 11 日起,https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps 就可以做到这一点

    来源:https://github.com/composer/composer/issues/4456#issuecomment-155825777

    编辑:误解。以上只是让自动加载器忽略指定的路径,它实际上并没有阻止它们在安装时被复制到文件系统。

    【讨论】:

    • 感谢指点!我正准备将您的答案标记为已接受,但在阅读文档后,看起来这只是从自动加载器中排除了这些文件:它们仍将存在于存档中。这显然是第一步,但我的最终目标是通过在从 Composer 安装时完全删除测试文件来减少存档大小。
    • 哦,对不起,我在那种情况下误解了这个问题:) 所以你想要 Bower 中的“忽略”选项(忽略 [array]:生产中不需要的路径数组,你希望 Bower安装包时忽略。) - 我不知道作曲家中的该功能 - 您是否在 github.com/composer/composer/issues 上创建了功能请求?
    【解决方案3】:

    可以通过在composer.json 文件中的archive 键中添加排除模式来控制存档创建。详情请见https://getcomposer.org/doc/04-schema.md#archive

    给出的例子(引用自上述网址):

    {
        "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 或影响任何需要在所述文件中进行不同设置的进程。

    【讨论】:

    • 谢谢,我阅读了您链接到的段落,但我不明白 which 归档这个目标:据我了解,Packagist 不托管包档案;相反,Composer 通过克隆 git 存储库或从 ZIP 存档(通常来自 GitHub,我猜它只遵循 .gitattributes 而不是 composer.json)来下载包。 Composer 是否仍然这样做,但会在本地删除排除的文件?
    • 一个很好的问题,我会调查的。确保此设置会影响 Satis 运行期间包的创建。我不确定从 Github 下载包。
    • @Sven 你调查过吗?
    • 我快速浏览了一下。我的印象:Composer 既有处理.gitignore/.gitattributes 文件的代码,也有我上面提到的配置,这表明 Composer 至少能够在本地处理这两种不同的排除模式源。它可以解释为什么 Satis 也会受到影响,因为它只是编排了已经存在的 Composer 代码,而没有添加太多。所以答案似乎是:“如果没有任何外部来源支持,Composer 能够在本地排除”。如果 Github 的 ZIP 有更多文件,我怀疑它们会被删除。
    【解决方案4】:

    这可以通过post-update-cmd composer.json 文件中的scripts 键自动完成:

    "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 {} +"
        ],
    },
    

    【讨论】:

    猜你喜欢
    • 2013-02-28
    • 2010-09-12
    • 2017-10-18
    • 2020-05-05
    • 1970-01-01
    • 2017-05-08
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多