自定义存储库不读取我的composer.json?

时间:2013-10-18 09:44:50

标签: fork composer-php

我已经分叉https://github.com/jasonlewis/basset,现在正在尝试将我的fork添加到我的项目中。但是,在我运行composer.json后,它似乎没有读取我的分叉composer update文件,为什么?我做错了什么?

我在repository之后添加了require: {}

"repositories": [
{
    "type":"package",
    "package": {
      "name": "marwelln/basset",
      "version":"master",
      "source": {
          "url": "https://github.com/Marwelln/basset.git",
          "type": "git",
          "reference":"master"
        }
    }
}
],

我的分叉composer.json看起来像这样(除了名字之外没有任何改变):

{
    "name": "marwelln/basset",
    "description": "A better asset management package for Laravel.",
    "keywords": ["assets", "basset", "laravel"],
    "license": "BSD-2-Clause",
    "authors": [
        {
            "name": "Jason Lewis",
            "email": "jason.lewis1991@gmail.com"
        }
    ],
    "require": {
        "php": ">=5.3.0",
        "kriswallsmith/assetic": "1.1.*"
    },
    "require-dev": {
        "mockery/mockery": ">=0.7.2",
        "illuminate/config": "4.0.*",
        "illuminate/console": "4.0.*",
        "illuminate/filesystem": "4.0.*",
        "illuminate/log": "4.0.*",
        "illuminate/routing": "4.0.*",
        "illuminate/support": "4.0.*",
        "symfony/process": "2.3.*"
    },
    "suggest": {
        "aws/aws-sdk-php": "Deploy static assets directly to your S3 buckets.",
        "rackspace/php-cloudfiles": "Deploy static assets directly to your Cloud Files container."
    },
    "autoload": {
        "psr-0": {
            "Basset": "src/"
        },
        "classmap": [
            "tests/Cases/FilterTestCase.php"
        ],
        "files": ["src/helpers.php"]
    },
    "extra": {
        "branch-alias": {
            "dev-master": "4.0-dev"
        }
    },
    "minimum-stability": "dev"
}

有了这个,Basset名称空间未在autoload_namespace.php中注册,也未在"kriswallsmith/assetic": "1.1.*"中注册,但如果我使用原始require: { "jasonlewis/basset" : "dev-master"},则会添加它。我错过了什么?

2 个答案:

答案 0 :(得分:1)

你做过一些被认为不是Composer最佳实践的东西。

首先,您应该尽量避免包含“package”类型的存储库,其中包含查找所需内容的所有详细信息。从长远来看,这将成为维护的噩梦。如果您完全确定软件的维护者不会自己包含composer.json文件,那么软件包应该只包含在您的composer.json中。文档陈述http://getcomposer.org/doc/04-schema.md#repositories

  

包:如果依赖于对composer没有任何支持的项目,您可以使用包存储库内联定义包。你基本上只是内联   composer.json对象。

这种情况不适用于此,因为您维护存储库以便自己使用,并且应该能够放入composer.json

现在,Composer支持分叉和扩展现有库,然后在代码中使用它的过程,但不是你的方式。首先,您应该替换供应商的名称,因为您接管了该角色,并且您的存储库和软件应该与其他软件包区分开来。因此,将“jasonlewis / basset”重命名为“marwelln / basset”是正确的,只有在您想引用自己的版本时才使用该名称。

现在的问题可能是,如果你分叉一个流行的库,并使用其他需要原始库的库,你最终会添加两个包。这就是“替换”字段的用途:您可以在自己的composer.json中声明您认为您的软件包能够替换原始软件。有些详细信息,请访问:http://getcomposer.org/doc/04-schema.md#replace

我在这里详细解答了“替换”的工作原理:How does the "replace" property work with composer?

最后,我认为你应该做以下事情(你仍然可以改变它):

克隆原始内容,将composer.json更改为您自己的供应商名称作为“名称”,并添加“替换”您正在更改的原始软件的版本。你可能应该对版本严格,因为你真的只替换你所知道的版本。如果以后您仍然知道更换新版本,则可以更改“替换”信息。

然后你必须像你一样添加你自己的存储库,并要求软件名称和你自己的供应商名称。

您可能在某个时间点完成了大部分操作,但添加替换信息的步骤是缺少的链接。

答案 1 :(得分:0)

我将repository更改为:

"repositories": [
{
    "type":"vcs",
    "url": "https://github.com/Marwelln/basset"
}
],

然后使用jasonlewis/basset代替marwelln/basset。它现在正在按预期工作。