【问题标题】:Depend on Specific Directory on GitHub Repository取决于 GitHub 存储库上的特定目录
【发布时间】:2015-02-06 21:05:40
【问题描述】:

我需要在我的项目中包含Erfurt 库。我不想手动将库复制到 vendor 目录中,而是说 Composer 从 GitHub 下载它。 Erfurt 不是 Composer 库,即。 e.没有 composer.json。

使用以下 composer.json,我可以从 Git 下载 Erfurt:

{
    "repositories": {
        "erfurt": {
            "type": "package",
            "package": {
                "name": "erfurt/erfurt",
                "version": "1.0.0",
                "source": {
                    "url": "https://github.com/AKSW/Erfurt.git",
                    "type": "git",
                    "reference": "5528b95ac3"
                }
            }
        }
    },
    "require": {
        "zendframework/zendframework1" : "1.12.*",
        "erfurt/erfurt": "1.0.0"
    },
    "autoload": {
        "classmap": ["vendor/Erfurt"]
    },
    "include-path": ["vendor"]
}

Composer 将完整的 Git 存储库下载到 vendor\erfurt\erfurt 目录中,但我只需要存储库的子目录 library/Erfurt

我已经测试过了

"url": "https://github.com/AKSW/Erfurt.git/library/Erfurt"

但没有成功。 是否可以建议 Composer 只下载 GitHub 存储库的子目录?

【问题讨论】:

  • 你能把你的 SVN 解决方案从问题中移出,变成一个新的答案吗?这让其他人更清楚,有多种方法可以解决这个问题,并且更适合 Stack Overflow 的问答模型;)

标签: php composer-php


【解决方案1】:

答案是:不。没有办法将 Composer 配置为仅下载子部分。

您要么必须向该项目提出一个 .gitattributes 文件,以过滤掉您不想要的所有内容(不太可能被接受,但这是另一个讨论 - 您也可以提出一个适当的 composer.json 文件),并且然后强制 Composer 使用 --prefer-dist,这将从 Github 下载 ZIP 版本而不是克隆 - 并且从 ZIP 中删除过滤后的文件。

或者您可以手动创建该软件的本地发布过程,该过程将准确创建您想要的 ZIP,而不是指向官方 Github 存储库,您可以指向您创建的 ZIP。

【讨论】:

  • 谢谢! Composer 也支持 SVN,GitHub 也提供了一个 SVN 克隆 URL。我已经通过"url": "https://github.com/AKSW/Erfurt/trunk/library/Erfurt", "type": "svn" 对其进行了测试,但没有它以 invalid package definition 结尾。你有从 SVN 克隆的想法吗?
  • 是一样的,虽然SVN没有提供过滤东西的方法。因为您不太可能在源存储库中实现过滤器,所以 Github 是否支持 Git 或 SVN 作为协议并不重要。如果源代码中正在进行重大重构,那么获取子目录可能会中断。最好的方法是发送一个 composer.json 文件的拉取请求。
【解决方案2】:

正如@Sven 回答的那样,Git 不可能。但 GitHub 也提供 SVN 访问,Composer 可以读取 SVN 存储库的某个子目录。这就是它最终的工作方式:

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "erfurt/erfurt",
                "version": "1.0.0",
                "source": {
                    "type": "svn",
                    "url": "https://github.com/AKSW/Erfurt",
                    "reference": "trunk/library/Erfurt"
                }
            }
        }
    ],
    "require": {
        "zendframework/zendframework1" : "1.12.*",
        "erfurt/erfurt": "1.0.0"
    },
    "autoload": {
        "classmap": ["vendor/erfurt/erfurt", "vendor/zendframework/zendframework1/library/Zend"]
    },
    "include-path": ["vendor/erfurt", "vendor/zendframework/zendframework1/library"]
}

现在我可以运行这个脚本了:

<?php
require_once __DIR__.'./vendor/autoload.php';

$erfurt = \Erfurt_App::getInstance();
$erfurt->loadConfig(
    new \Zend_Config(
        array(
            'store' => array(
                'backend' => 'virtuoso',
                'virtuoso' => array(
                    'dsn' => 'VOS',
                    'username' => 'dba',
                    'password' => 'dba'
                )
            )
        )
    )
);
$erfurt->authenticate('dba', 'dba');
$store = $erfurt->getStore();
$graphs = $store->getAvailableModels();
echo '<pre>' . var_dump($graphs) . '</pre>';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多