如何正确地要求Composer中的特定提交,以便它可用于依赖包?

时间:2014-01-23 16:48:50

标签: php github composer-php

我有一个库foo/foo-lib requires来自GitHub的特定提交:

{
    "name": "foo/foo-lib",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/KnpLabs/Gaufrette.git"
        }
    ],
    "require": {
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

并且工作正常:

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)                                 
  - Updating knplabs/gaufrette dev-master (2633721 => 2633721)
    Checking out 2633721877cae79ad461f3ca06f3f77fb4fce02e

Generating autoload files

但是当我在其他项目中需要该库时:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master"
    }
}

它会产生依赖性错误:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for foo/foo-lib dev-master -> satisfiable by foo/foo-lib[dev-master].
    - foo/foo-lib dev-master requires knplabs/gaufrette dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e -> no matching package found.

所以我的问题是:如何正确require我的库中GitHub的特定提交,以便它可以在依赖包中使用?

3 个答案:

答案 0 :(得分:129)

您必须在您的库和应用程序中明确要求该散列处的Gaufrette库,并带有dev标记。这样的东西应该在应用程序composer.json中起作用:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master",
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

来自the documentation

  

如果您的某个依赖项依赖于unstable包   你需要明确要求它,以及它的足够   稳定旗帜。

该文档还建议您需要在您的bar/bar-app Composer文件中包含Gaufrette的存储库,尽管听起来在这种情况下不需要这样做。我不确定为什么。

答案 1 :(得分:5)

这是您在命令行上的操作方式:

composer update knplabs/gaufrette:dev-master#2633721 --with-dependencies

您不必使用整个哈希,看起来像七个字符长的哈希就可以解决问题。如上所述,您的项目将需要支持dev-如果尚未设置,它将抱怨。另外,使用--with-dependencies来获取您要更新的依赖项。

答案 2 :(得分:0)

如果您通过分叉对Git存储库进行更改,请确保使用 程序包名称实际上是在程序包自己的composer.json文件中定义的-因此,即使我将程序包分叉到了自己的joshuapaling github帐户上,并且程序包现在位于URL https://github.com/joshuapaling/Cake-Resque.git上,但该设置没有影响从作曲家的角度来说,这个软件包的名称根本没有。

一个愚蠢的错误-但是我是作曲家的新手,一开始还不清楚!因此,我希望这可以帮助遇到相同问题的其他人。