使用Composer从私有git仓库安装依赖项

4

我有两个私有GitHub账户上的项目-一个是库,另一个是我的应用程序。

我想将我的库包含到我的应用程序中。

我的库的composer.json文件如下:

{
  "name": "andyw/mylibrary",
  "description": "My Library",
  "license": "proprietary",
  "homepage": "https://github.com/andyw/mylibrary",
  "require": {
    "php": ">=5.5.0",
    "monolog/monolog": "1.*",
    "guzzle/guzzle": "3.*",
    "aws/aws-sdk-php": "2.*",
    "nixilla/twitter-api-consumer": "*",
    "webignition/robots-txt-file": "dev-master",
    "webignition/robots-txt-parser": "dev-master",
    "pusher/pusher-php-server": "*",
    "symfony/validator": "2.*"
  },
  "require-dev": {
    "phpunit/phpunit": "3.*"
  },
  "autoload": {
    "psr-0": {
      "": "src/"
    }
  }
}

在该项目中运行composer update可以成功安装依赖项。到目前为止,一切都很顺利。

现在这是我的应用程序的composer.json文件:

{
  "name": "andyw/myapp",
  "type": "project",
  "description": "My application",

  "homepage": "https://github.com/andyw/myapplication",
  "license": "proprietary",
  "repositories": [
    {
      "type": "git",
      "url": "git@github.com:andyw/myapplication.git"
    }
  ],
  "require": {
    "php": ">=5.5.0",
    "andyw/mylibrary": "dev-master",
    "facebook/php-sdk-v4": "4.0.*",
    "silex/silex": "~1.1",
    "monolog/monolog": "~1.6",
    "twig/twig": "~1.14",
    "doctrine/dbal": "~2.4",
    "nesbot/Carbon": "~1.6",
    "aws/aws-sdk-php": "2.*",
    "jms/serializer": "0.15",
    "symfony/validator": "2.*",
    "jdesrosiers/silex-cors-provider": "~0.1.2",
    "swiftmailer/swiftmailer": ">=4.1.2,<4.2-dev",
    "fzaninotto/faker": "~1.4"
  },
  "require-dev": {
    "mockery/mockery": "~0.8.0"
  },
  "autoload": {
    "psr-0": {
      "App": "src/"
    }
  }
}

在该项目上运行composer update失败。添加--verbose标志会输出以下内容:
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for andyw/mylibrary dev-master -> satisfiable by andyw/mylibrary[dev-master].
    - andyw/mylibrary dev-master requires webignition/robots-txt-file dev-master -> no matching package found.

如果我的库可以安装webignition/robots-txt-file dev-master,为什么它不能作为依赖项的依赖项安装?如何解决这个问题?
提示:我的所有存储库都不是公开的,并且出于隐私原因我已更改了我的软件包/文件名称。

1
添加 "minimum-stability": "dev" 标志并尝试。 - Hari K T
谢谢 - 这确实起作用了,但它似乎拉下了我们所有其他依赖项的开发版本,这可能不是理想的情况。 - theandywaite
1
您尚未指定某些库的版本。请参阅 dev-masterdev-master 始终被 Composer 视为开发版本。或者,您可以指定版本并下载。 - Hari K T
@naxtek 你解决了这个问题吗? - hsz
1
如果你更喜欢稳定版而非开发版,你也应该添加 "prefer-stable": true - localheinz
1个回答

1
永远不要依赖分支!总是使用已标记的版本。这是使用Composer时最重要的规则。
分支是移动目标。如果有人提交了新内容,这将移动指向您正在使用的软件状态的指针,您无法轻松找到此状态。而且,分支被认为是开发稳定性,唯一可以设置稳定性的包是根应用程序包。依赖于开发稳定性中其他包的库是非常糟糕的想法,因为它们强制根应用程序明确允许开发稳定性。
从长远来看,这非常糟糕。它会使您的软件无法维护,以至于使用Composer将始终失败,破坏东西,您开始想知道为什么每个人都在使用它(提示:他们不依赖于分支)。
现在的问题是:
webignition/robots-txt-file有标记版本:0.1和0.2,0.2正好与主分支相同。只需使用它!
webignition/robots-txt-parser也是如此,但在这里您有版本1.0、1.0.1和1.0.2,而主分支正好是版本1.0.2。
你应该能够简单地更新到这些版本。如果无法更新,因为你的软件依赖于旧版的主分支,那么你就会遇到依赖分支时的问题:你的库告诉我 dev-master 是可以的,而当我查看包的仓库时,dev-master 分别是版本 0.2 或 1.0.2,我希望它能正常工作。如果你明确指向像 0.1 和 1.0.1 这样的版本,这不太可能随着时间的推移而改变,并且将始终是一个有效的组合。
请注意,检查外部包开发者是否使用语义化版本控制是个好主意,然后使用适当的通配符选择器来选择版本范围。允许一些版本上的松散性将使多个依赖于同一个第三方包的包更容易达成共识。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接