Как переместить зависимость composer из require-dev в require?

у меня есть два проекта на моем сервере git РЕПО. Первый-это библиотека, которую я написал, назовем ее foo/lib-bar. Второй-это приложение, которое использует эту библиотеку foo/app-bar. В настоящее время библиотека находится в версии разработки, поэтому composer.json файл библиотеки выглядит так:

{
    "name": "foo/lib-bar",
    "description": "Bar library",
    "version": "1.0.0-dev",
    "type": "library",
    "require": {
        "php": ">=5.4",
        "ext-posix": "*"
    }
}

приложение использует эту библиотеку, поэтому она содержит необходимое требование:

{
    "name": "foo/app-bar",
    "description": "Bar application",
    "version": "0.5.0-dev",
    "type": "application",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://user@git.example.com/lib-foo"
        }
    ],
    "require-dev": {
        "foo/lib-bar": ">=1.0.0-dev",
    },
    "require": {
        "php": ">=5.5.3"
    }
}

и все гладко до этого момента: обе composer install и composer update запуск ожидается, установите зависимость, и я вижу ее в vendor/

теперь документы говорит, что

require#

Lists packages required by this package. The package will not be installed unless those requirements can be met.

и для шагов, которые приводят к проблеме в вопросе:

Итак, моя библиотека готова к развертыванию и выходу из фазы разработки. Это также требуется в производственной версии моего приложения. Я удаляю dev суффикс от моего библиотека, фиксации и нажмите Файл, и я готов обновить приложение.

С приложением composer.json я перемещаю зависимость библиотеки из до require и удалить dev суффикс (все скопировано, поэтому нет опечатки-я проверил и перепроверил снова):

    "require-dev": {},
    "require": {
        "php": ">=5.5.3",
        "foo/lib-bar": ">=1.0.0"
    }

теперь я бегу composer update а я:

$ composer update
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
    - Installation request for foo/lib-bar >=1.0.0 -> satisfiable by foo/lib-bar[dev-master].
    - Removal request for foo/lib-bar == 9999999-dev

я предположил, что он не нашел новую версию, поэтому я удалил старую библиотеку вручную:

$ rm composer.lock
$ rm -rf vendor/foo/

и пытался установить его с нуля

$ composer install

но на этот раз он дает мне:

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

  Problem 1
    - The requested package foo/lib-bar could not be found in any version, there may be a typo in the package name.

похоже require-dev работает, а require не. Есть предположения, что здесь могло пойти не так?

1 ответов


require-dev не место для разработки зависимостей. Он предназначен для программного обеспечения, которое используется только в разработке, например PHPUnit, Mockery и т. д., или для зависимостей, которые полезны сами по себе, но в этом случае используются только для разработки, например, клиентская библиотека для службы, о которой идет пакет программного обеспечения (чтобы сделать некоторые реальные запросы в тестовом сценарии).

таким образом, ваша библиотека не должна была быть "require-dev" с самого начала.

другое дело: композитор будет вычесть версию, если используйте соответствующие ветви и теги, т. е. ветвь с именем " 1.0.x " в вашем репозитории будет обнаружен как ветвь разработки для всех версий 1.0, и любые требования к таким версиям могут быть удовлетворены этой ветвью-при условии, что вы разрешите версии разработки либо установив "minimum-stability": "dev" (что позволит версии разработки для всех программ-довольно непреднамеренно), или когда вам требуется версия "1.0.0@dev" для вашего программное обеспечение.

единственное, что может в настоящее время сломать вашу настройку композитора, - это то, что вы упоминаете версию в librarys composer.JSON явно, и это версия разработки. Вы удалили этот индикатор версии? Вы должны удалить его, потому что жизнь проще, если Composer может обнаружить версии из тегов в репозитории, а не путем их явного упоминания в composer.формат JSON.

наконец, пожалуйста, убедитесь, что при использовании Git вы тег commit С нужную версию. The requireверсия d должна соответствовать версии с тегами git.