如何使用Composer安装一个没有版本号的包(只有主分支)?

18

我是第一次使用Composer,正在尝试通过composer update安装以下库:

https://github.com/neitanod/forceutf8

因此,据我理解,我的composer.json看起来像这样

{
    "config": {
        "vendor-dir": "libs/vendor"
    },
    "require": {
        "raven/raven": "0.7.1",
        "monolog/monolog": "1.7.*",
        "smarty/smarty": "3.1.16",
        "forceutf8/forceutf8": "master"
    }
}

但出于某种原因(我认为是forceutf8没有版本),它会因错误而停止,所有其他内容都已正确安装,我收到的错误信息是:

Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - The requested package forceutf8/forceutf8 could not be found in any version, there may be a typo in the package na
me.

Potential causes:
 - A typo in the package name
 - The package is not available in a stable-enough version according to your minimum-stability setting
   see <https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion> for more details.

Read <http://getcomposer.org/doc/articles/troubleshooting.md> for further common problems. 

我也尝试了下面的版本,但仍然没有成功。

{
    "config": {
        "vendor-dir": "libs/vendor"
    },
    "name": "career/skillquest",
    "repositories": [
      {
        "type": "vcs",
        "url": "https://github.com/neitanod/forceutf8"
      }
    ],
    "require": 
      {
        "forceutf8/forceutf8": "dev-master",
        "raven/raven": "0.7.1",
        "monolog/monolog": "1.7.*",
        "smarty/smarty": "3.1.16"
      }
}

问题在于它需要这样做

"neitanod/forceutf8": "dev-master"

不是

"forceutf8/forceutf8": "master"
4个回答

35

首先,你的名字是错的:forceutf8/forceutf8 正确的名字是:neitanod/forceutf8

Composer会为每个分支名称添加前缀“dev-”,如果它不像一个版本号,并且为看起来像版本号的分支名称添加后缀“-dev”。

例如:分支“master”被称为“dev-master”,分支“feature”被称为“dev-feature”。分支“1.0.x”被称为“1.0.x-dev”。

所以这部分是错误的:

"require": {
    "raven/raven": "0.7.1",
    "monolog/monolog": "1.7.*",
    "smarty/smarty": "3.1.16",
    "forceutf8/forceutf8": "master"
}

正确版本应该是:

"require": {
    "raven/raven": "0.7.1",
    "monolog/monolog": "1.7.*",
    "smarty/smarty": "3.1.16",
    "neitanod/forceutf8": "dev-master"
}

现在要求没有标记版本的分支并不是最好的选择,因为这些信息相当不稳定——任何新的提交都可能破坏事情,并且很难准确地指向您想使用的提交。为了保护您免受此影响,Composer默认不加载这些开发分支,而只会加载稳定版本。您需要启用加载开发版本:

"require": {
    "raven/raven": "0.7.1",
    "monolog/monolog": "1.7.*",
    "smarty/smarty": "3.1.16",
    "neitanod/forceutf8": "dev-master@dev"
}
“@dev”标记允许加载所提到的版本的开发版(本例中为一个分支,但“1.0.0 @ dev”也可以这样使用,允许所有1.0.0版本(包括dev),例如 “1.0.0-alpha”,还有稳定版“1.0.0”)。
请注意,您也可以使用“minimum-stability”允许所有依赖项的开发版本,但不建议这样做,因为它将根据版本要求加载EVERYTHING的开发版本。 在您的情况下,您只会获取monolog 1.7分支的最新开发版本,但这可能足以使一次稳定的软件陷入破坏状态。”

但是这个不识别 Git URL? - mahen3d
我假设这个包已经在http://packagist.org注册了,但目前该网站似乎无法访问。因此,您将无法更新任何内容。 - Sven
2
非常感谢您解释:“Composer会给不像版本号的每个分支名称添加前缀"dev-",并给看起来像版本号的分支名称添加后缀"-dev"。”我非常讨厌Composer中的这种语法。 - user3751385

25

composer.json文件中:

{
    "name": "example/example-app",
    "repositories": [
      {
        "type": "vcs",
        "url": "https://github.com/neitanod/forceutf8"
      }
    ],
    "require": 
      {
        "neitanod/forceutf8": "dev-master",
        "raven/raven": "0.7.1",
        "monolog/monolog": "1.7.*",
        "smarty/smarty": "3.1.16"
      }
}

请问您能否添加完整的JSON文件和其他包?我尝试添加了,但无法获取所需的文件格式。 - mahen3d
那么forceutf8软件在哪里? - Sven
抱歉,我忘记在require中添加'forceutf8'。已修复。 - Alexandr T
尝试过了但仍然不起作用,我遇到了问题1 - 请求的包forceutf8/forceutf8在任何版本中都找不到,可能是包名称拼写错误。 - mahen3d
require 中写入 *"neitanod/forceutf8" : "dev-master"*,而不是 *"forceutf8/forceutf8": "dev-master"*。 - Alexandr T

12
很简单!您应该在控制台上键入以下内容:
composer require blablabla@thepackage dev-master

1

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