Композитор: як я можу встановити іншу залежність без оновлення старих?


196

У мене є проект з кількома залежностями, і я хотів би встановити ще один, але я хотів би зберегти інших таким, яким вони є. Отже, я відредагував composer.json, але якщо запустити composer install, я отримаю такий вихід:

Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

Перш за все, у мене встановлено mcrypt, тому я не знаю, чому там скаржиться.

Отже, як я можу встановити цю нову залежність?

Мій composer.json:

{
    "require": {

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    },
    "minimum-stability": "dev"
}

1
Попередження mcrypt може бути від декількох встановлень php ... php з розширенням mcrypt може бути не тим самим, що встановлено як ваш php-cli
Matthemattics

Відповіді:


293

Щоб встановити новий пакет і тільки це, у вас є два варіанти:

  1. За допомогою requireкоманди просто запустіть:

    composer require new/package
    

    Композитор вгадає найкраще обмеження версії для використання, встановить пакет та додасть його composer.lock.

    Ви також можете вказати явне обмеження версії, запустивши:

    composer require new/package ~2.5
    

–OR–

  1. За допомогою updateкоманди додайте новий пакет вручну composer.json, а потім запустіть:

    composer update new/package
    

Якщо композитор скаржиться, заявляючи, що "Ваші вимоги не вдалося вирішити до встановленого набору пакетів". Ви можете вирішити це, передавши прапор --with-dependencies. Це дозволить отримати список усіх залежностей пакету, який ви намагаєтесь встановити / оновити (але жодна з інших ваших залежностей).

Що стосується питань, які задають запитання про Laravel та mcrypt: перевірте, чи правильно він включений у вашому CLI php.ini. Якщо php -mmcrypt не відображається, він відсутній.

Важливо: Не забудьте вказати new/packageпід час використання composer update! Якщо вимкнути цей аргумент, всі залежності, а також composer.lockбудуть оновлені.


3
Я отримав повідомлення "Пакет [...], вказаний для оновлення, не встановлений. Ігнорування".
Геррі

11
Це не працює для мене. Мені сказано, що "Пакет" x / y ", вказаний для оновлення, не встановлений. Ігнорування ", а потім йде про оновлення всього. Отже, він не встановлює новий пакет, який я хочу, і він оновлює все інше, що прямо протилежне тому, що я хочу.
тремтіть

3
Це просто не працює. "Ваші вимоги не вдалося вирішити до встановленого набору пакетів." (і текст про деякі старі пакунки, зовсім не пов'язані з якими я прошу), коли я прошу лише оновити один пакет.
OZ_

@tremby Тут просто чудово працює. Можливо, ви забули додати "new/package" : "*",в "require"розділ composer.json ?
Potherca

@OZ_ Навіть якщо потрібно встановити лише одну залежність, її все одно потрібно вирішити спочатку, щоб переконатися, що вона не суперечить вашим іншим залежностям.
Potherca

30

Власне, правильне рішення:

composer require vendor/package

Взяте з документації CLI для композитора :

requireКоманда додає нові пакети в composer.jsonфайл з поточного каталогу.

php composer.phar require

Після додавання / зміни вимог змінені вимоги будуть встановлені або оновлені.

Якщо ви не хочете вибирати вимоги інтерактивно, можете просто передати їх команді.

php composer.phar require vendor/package:2.* vendor/package2:dev-master

Хоча це правда, що composer updateвстановлює нові пакети, знайдені в composer.json, він також оновить файл composer.lock та будь-які встановлені пакети відповідно до будь-якої нечіткої логіки ( >або *символів після колонок), знайденої в composer.json! Цього можна уникнути, використовуючи composer update vendor/package, але я б не рекомендував користуватися цим звичкою, оскільки ви один забутий аргумент від потенційно зламаного проекту ...

Будьте здорові та дотримуйтесь речей composer require vendor/packageдля додавання нових залежностей! 😉


Але чи буде використовувати composer requireоновлення файлу composer.lock?
Філ

2

Мій випадок використання простіший і відповідає просто вашому заголовку, але не вашим подальшим деталям.

Тобто, я хочу встановити новий пакет, який ще не в моєму, composer.jsonбез оновлення всіх інших пакетів.

Рішення тут є composer require x/y


1

У моєму випадку я мав репо з:

  • вимоги A, B, C, D в .json
  • але лише A, B, C в .lock

Тим часом A, B, C мали новіші версії щодо створення блокування.

Чомусь я видалив "продавців" і хотів зробити це composer installі не вдалося з повідомленням:

Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Я намагався запустити рішення від Seldaek, видаючи, composer update vendorD/libraryDале композитор наполягав на тому, щоб оновити більше речей, тому в .lockмоєму інструменті git занадто зміни.

Я використовував рішення:

  1. Видаліть весь vendorsреж.
  2. Тимчасово видаліть вимогу VendorD/LibraryDз .json.
  3. бігати composer install.
  4. Потім видаліть файл .jsonі повторно виправте його з репо (що еквівалентно повторному додаванню файлу, але уникайте потенційних змін пробілу).
  5. Потім запустіть рішення Seldaek composer update vendorD/libraryD

Він встановив бібліотеку, але, крім того, gitрозбіг показав мені, що .lockлише нові речі додаються без редагування інших.

(Thnx Seldaek для вказівника;))


це надмірність. просто видаліть файл блокування та запустіть установку композитора. працює
астроану

6
Це відповідає дійсності для непрофесійних середовищ, де ви можете із задоволенням відновити залежності, і якщо щось порушиться, ви перейдіть і виправте це. Але якщо для вас сервери, які виходять з ладу, означають, що ви втрачаєте 10 000 доларів на годину, то ви не сумніваєтесь у тому, що цю програму composer.lockніколи не можна буде щасливо видаляти та відновлювати. .lockє ... для блокування !! ; D - інакше файл блокування був би марним, і ви не будете його коментувати або він взагалі не буде існувати. Якщо ви будете працювати в компанії, орієнтованої на якість, перебудовуєте і здійснюєте блокування із залежністю від 1.000, всі вони зміняться, і люди з якості приїдуть вбити вас ха-ха.
Хаві Монтеро

2
Привіт @astroanu просто для того, щоб уточнити, що якщо ви встановили залежність на більш ранній термін, а частина її залежності захоплювала останню версію майстра розробників, то можуть бути серйозні проблеми у простому видаленні composer.lock і просто натисканні на встановлення. Якщо у вас не було можливості перевірити вплив введення залежності, то є потенціал для несподіваних результатів і, можливо, створення поганого досвіду для користувачів.
dkcwd

звичайно, видалення файлу блокування та запуск встановлення / оновлення або запуску оновлення навіть без видалення файлу блокування вплине на стабільність програм. Оновлення композитора слід проводити лише в середовищі розробників. На виробництві завжди використовуйте інсталятор композитора, оскільки збірка виробництва перевірена на збереження у файлі блокування.
астроану
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.