2012-10-18 41 views
70

我想用composer从github自动克隆一个不在packagist的git存储库,但它不工作,我不知道我做错了什么。使用PHP作曲家来克隆git回购

我想我已经把它列入“资源库”像这样之中:

"repositories": [ 
    { 
     "url": "https://github.com/l3pp4rd/DoctrineExtensions.git", 
     "type": "git" 
    } 
], 

,然后可能列出它在“要求”一节。它应该与this example类似,但它不起作用。它只是给出了这个错误:

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

有没有人试图做这样的事情呢?

回答

75

在2013年写作时,这是一种方法。作曲家增加了对更好途径的支持:请参阅@igorw的answer

您是否拥有储藏室?

Git,Mercurial,SVN由Composer支持。

您是否有权访问存储库?

是吗?

是否库中的一个composer.json文件

如果你有,你可以写一个库:添加composer.json文件,或修复现有的一个,并且不使用下面的解决方案。

转到@igorw的answer

只能用这个如果你没有一个仓库
或者如果仓库没有一个composer.json,你不能将其添加

这将覆盖Composer可以从原始存储库的composer.json中读取的所有内容,包括软件包的依赖关系和自动加载。

使用package类型会将正确定义所有内容的负担转移给您。更简单的方法是在存储库中有一个composer.json文件,并使用它。

此解决方案仅适用于极少数情况下,您无法更改已放弃的ZIP下载或只能读取的存储库,但不再进行维护。

"repositories": [ 
    { 
     "type":"package", 
     "package": { 
      "name": "l3pp4rd/doctrine-extensions", 
      "version":"master", 
      "source": { 
       "url": "https://github.com/l3pp4rd/DoctrineExtensions.git", 
       "type": "git", 
       "reference":"master" 
      } 
     } 
    } 
], 
"require": { 
    "l3pp4rd/doctrine-extensions": "master" 
} 
+5

使用软件包存储库替换VCS存储库是个不错的主意。目标回购已经有一个'composer.json',所以使用一个vcs回购。您的示例还会中断自动加载并忽略“分支别名”。 – igorw

+1

@igorw请问您可以链接到这些信息,以便我和其他人能够理解这些差异?谢谢。 –

+4

如所解释的[存储库页](http://getcomposer.org/doc/05-repositories.md#package-2)包装回购必须包括所有信息。如果您不添加'autoload'字段,则不会包含它。基本上你需要将'composer.json'中的所有信息复制粘贴到回购定义中。 VCS repo直接从VCS获取该信息。 '别名文档](http://getcomposer.org/doc/articles/aliases.md#branch-alias)和[我写的博客文章]解释了'branch-alias'的好处(https:// igor.io/2013/01/07/composer-versioning.html)。 – igorw

1

如果要使用GitHub中的composer.json,请查看this example(位于VCS部分下)。

包部分用于没有composer.json的包。然而,你并没有遵循这个例子,或者它也能起作用。不要看它说什么关于包库:

Basically, you define the same information that is included in the composer repository's packages.json , but only for a single package. Again, the minimum required fields are name, version, and either of dist or source.

102

这个包其实is available through packagist。在这种情况下,您不需要定制存储库定义。只要确保您添加require(始终需要)与匹配的版本约束。

一般情况下,如果包装上有包装,请不要添加VCS回购。它只会减慢速度。


对于通过packagist没有可用的软件包,使用VCS(或GIT)库,如图你的问题。当你这样做,确保:

  • 的“库”字段在根composer.json规定(这是一个唯一的根域,从需要的软件包库的定义被忽略)
  • 的库定义点一个有效的VCS回购
  • 如果类型是“混帐”,而不是“VCS”(如你的问题),请确保它实际上是一个git回购
  • 您的问题
  • 有包一 require
  • require中的约束与提供的版本相匹配d由VCS回购。您可以使用composer show <packagename>来查找可用版本。在这种情况下,~2.3将是一个不错的选择。
  • require中的名称与远程composer.json中的名称相匹配。在这种情况下,它是gedmo/doctrine-extensions

下面是一个示例composer.json经由VCS回购安装在同一封装:

{ 
    "repositories": [ 
     { 
      "url": "https://github.com/l3pp4rd/DoctrineExtensions.git", 
      "type": "git" 
     } 
    ], 
    "require": { 
     "gedmo/doctrine-extensions": "~2.3" 
    } 
} 

VCS repo docs解释所有的这相当好。


如果有一个Git(或其他VCS)资源库和composer.json可用,使用“打包”回购。套餐回购请求您在定义中提供全部元数据,并且完全忽略任何composer.json存在于所提供的dist和源中。它们也有其他限制,例如在大多数情况下不允许正确更新。

避免套餐回购(see also the docs)。

+1

奥羽,谢谢!我没有找到它,因为我认为它会在git repo DoctrineExtensions之后被调用。 – martin

+1

请务必查看'composer.json'中给出的名称。 – igorw

+0

谢谢,下一次,我会更聪明:)。 – martin

2

在我的情况下,我使用Symfony2.3.​​x,并且最小稳定性参数默认为“stable”(这很好)。我想导入一个不是packagist的repo,但有同样的问题“您的需求无法解析为可安装的一组软件包”。 看来,我尝试导入的回购库中的composer.json使用最小稳定性“开发”。

所以要解决此问题,请不要忘记验证minimum-stability。我通过要求dev-master版本而不是master来解决此问题,如post中所述。

+2

我有同样的问题,这里讨论[https://getcomposer.org/doc/04-schema.md#package-links]。如果你有一个明确的ref(比如git commit),看起来你可以做一些类似'“dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e”'。 – Blaskovicz

31

可以包括git仓库到composer.json这样的:

"repositories": [ 
{ 
    "type": "package", 
    "package": { 
     "name": "example-package-name", //give package name to anything, must be unique 
     "version": "1.0", 
     "source": { 
      "url": "https://github.com/example-package-name.git", //git url 
      "type": "git", 
      "reference": "master" //git branch-name 
     } 
    } 
}], 
"require" : { 
    "example-package-name": "1.0" 
} 
+1

正如上面的其他答案中所述:如果你有一个仓库,尽可能添加一个'composer.json'文件。 – Sven

+0

@Sven ...因为无法指定特定的提交吗? –

+0

谢谢你的分享,节省了我的时间:) – metamaker

2

我遇到了以下错误:The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

如果你分叉另一个回购,以使自己的改变,你将结束与一个新的存储库。

E.g:

https://github.com/foo/bar.git 
=> 
https://github.com/my-foo/bar.git 

新的URL将需要进入你的composer.json的版本库部分。

请记住,如果您需要在您的需求部分中将您的分支引用为my-foo/bar,那么您必须在新的回购库中重命名composer.json文件中的软件包。

{ 
    "name":   "foo/bar", 

=> 

{ 
    "name":   "my-foo/bar", 

如果你刚分叉,最简单的方法是在github中编辑它。

+0

请注意,软件包名称并不反映你从哪里可以读取存储库的URL!两者之间没有自动链接,都可以单独选择。关于Composer的唯一相关信息是写入'composer.json'里面'name'属性的名字。 – Sven

1

只要告诉作曲家使用,如果源可供选择:

composer update --prefer-source 

或者:

composer install --prefer-source 

然后你会得到包作为克隆库,而不是提取的压缩包,这样你就可以做出一些改变,并承诺他们回来。当然,假设您有对存储库的写/推权限,并且Composer知道项目的存储库。

声明:我觉得我可以回答有点不同的问题,但是这是我一直在寻找,当我发现这个问题,所以我希望这将是对别人有用的。

如果作曲家不知道,在该项目的存储库是,或者项目没有正确的composer.json,情况有点复杂,但别人已经回答了这样的场景。