2014-01-19 3 views
8

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

{ 
    "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://[email protected]/lib-foo" 
     } 
    ], 
    "require-dev": { 
     "foo/lib-bar": ">=1.0.0-dev", 
    }, 
    "require": { 
     "php": ">=5.5.3" 
    } 
} 

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

Теперь, the docs говорит, что

require# 

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

И шаги, которые ведут к рассматриваемому вопросу:

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

С приложением composer.json я двигаюсь зависимость библиотеки из require-dev раздела 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 и т. Д., Или для зависимостей, которые могут быть полезны сами по себе, но в этом случае используются только для разработки, например, клиентской библиотеки для службы, сделать некоторые реальные запросы в тестовом сценарии).

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

Другое дело: Композитор будет вычитать версию, если использовать соответствующие ответвления и метки, т.е. филиал под названием «1.0.x» в вашем хранилище будет обнаружен как ветвь развития для всех версий 1.0, и любые требования поскольку такие версии могут быть удовлетворены этой ветвью - при условии, что вы разрешаете версии для разработки либо путем установки "minimum-stability": "dev" (что позволит версии разработки для ПО ALL - довольно непреднамеренные), или когда вам требуется версия "[email protected]" для вашего программного обеспечения.

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

Наконец, пожалуйста, убедитесь, что при использовании Git вы отметьте фиксацию с соответствующей версией. Версия require d должна соответствовать версии с меткой git.

+0

Справедливая точка: 'require-dev' не должен был быть с самого начала, но я использовал его, поскольку Composer работал только с этим. Я alos заметил, что многие библиотеки там вкладывают много вещей в 'require-dev', если они принадлежат VCS. Только зависимости, доступные в Packagist, используются в 'require', поэтому у людей может быть такая же проблема, как и у меня. Что касается тегов: я понял, что композитор будет проверять ветки, поэтому я создал ветку «1.0.0», и она все еще не работала. Я не думал о ** пометке коммитов ** - моей ошибке (или отсутствующей документации?). И я думаю, что это ** святой Грааль ** здесь. –

+0

Удаление индикатора версии, вероятно, будет, но я ** действительно ** не хочу этого делать, потому что это то, что я хочу: указать Composer на определенную версию, которую я requrest. Композитор может обнаружить версию из репозитория, но я хочу указать, какую версию мне нужно. Разве это не цель поля версии в 'composer.json'? –

+1

Если вы включите '' version ': "1.0.0" 'в композитор вашей библиотеки composer.json, а также пометьте это, вы создадите конфликтующую информацию для Composer. Это не противоречит, если тег также «1.0.0», но эта статическая информация в composer.json будет забыта обновить при пометке новой версии. Не используйте его, Composer отлично работает, имея только версию в теге. – Sven

Смежные вопросы