Nhà soạn nhạc: làm thế nào tôi có thể cài đặt một phụ thuộc khác mà không cập nhật những cái cũ?


196

Tôi có một dự án với một vài phụ thuộc và tôi muốn cài đặt một dự án khác, nhưng tôi muốn giữ cho những người khác theo cách của họ. Vì vậy, tôi đã chỉnh sửa composer.json, nhưng nếu tôi chạy composer install, tôi nhận được kết quả sau:

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.

Trước hết, tôi đã cài đặt mcrypt, vì vậy tôi không biết tại sao nó lại phàn nàn về điều đó.

Vì vậy, làm thế nào tôi có thể cài đặt phụ thuộc mới này?

Nhà soạn nhạc của tôi.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
Cảnh báo mcrypt có thể là từ nhiều cài đặt php, cài đặt php với phần mở rộng mcrypt có thể không giống với cài đặt php-cli của bạn
Matthemattics

Câu trả lời:


293

Để cài đặt gói mới và chỉ có vậy, bạn có hai tùy chọn:

  1. Sử dụng requirelệnh, chỉ cần chạy:

    composer require new/package
    

    Trình soạn thảo sẽ đoán ràng buộc phiên bản tốt nhất để sử dụng, cài đặt gói và thêm nó vào composer.lock.

    Bạn cũng có thể chỉ định một ràng buộc phiên bản rõ ràng bằng cách chạy:

    composer require new/package ~2.5
    

-HOẶC LÀ-

  1. Sử dụng updatelệnh, thêm gói mới theo cách thủ công vào composer.json, sau đó chạy:

    composer update new/package
    

Nếu Nhà soạn nhạc phàn nàn, nêu rõ "Không thể giải quyết các yêu cầu của bạn đối với một bộ gói có thể cài đặt được.", Bạn có thể giải quyết vấn đề này bằng cách chuyển cờ --with-dependencies. Điều này sẽ đưa danh sách trắng tất cả các phụ thuộc của gói bạn đang cố gắng cài đặt / cập nhật (nhưng không phụ thuộc vào các phụ thuộc khác của bạn).

Về các vấn đề của người hỏi với Laravel và mcrypt: hãy kiểm tra xem nó có được kích hoạt đúng trong CLI php.ini của bạn không. Nếu php -mkhông liệt kê mcrypt thì nó bị thiếu.

Quan trọng: Đừng quên chỉ định new/packagekhi sử dụng composer update! Bỏ qua đối số đó sẽ khiến tất cả các phụ thuộc cũng như composer.lockđược cập nhật.


3
Tôi nhận được thông báo "Gói [...] được liệt kê để cập nhật chưa được cài đặt. Bỏ qua."
Gerry

11
Điều này không làm việc cho tôi. Tôi được thông báo 'Gói "x / y" được liệt kê để cập nhật chưa được cài đặt. Bỏ qua "và sau đó nó đi về việc cập nhật tất cả mọi thứ Vì vậy, nó không cài đặt gói mới tôi muốn và nó sẽ cập nhật mọi thứ khác, đó là hoàn toàn ngược lại những gì tôi muốn...
tremby

3
Nó không hoạt động. "Các yêu cầu của bạn không thể được giải quyết thành một bộ các gói có thể cài đặt được." (và văn bản về một số gói cũ, không liên quan đến tất cả những gì tôi yêu cầu) khi tôi yêu cầu chỉ cập nhật một gói.
OZ_

@tremby Hoạt động tốt ở đây. Có lẽ bạn đã quên thêm "new/package" : "*",vào "require"phần composer.json ?
Potherca

@OZ_ Ngay cả khi chỉ có một phụ thuộc được cài đặt, nó vẫn cần được giải quyết trước để đảm bảo nó không xung đột với các phụ thuộc khác của bạn.
Potherca

30

Trên thực tế, giải pháp chính xác là:

composer require vendor/package

Lấy từ tài liệu CLI cho Nhà soạn nhạc :

Các requirelệnh bổ sung thêm gói mới cho composer.jsontập tin từ thư mục hiện hành.

php composer.phar require

Sau khi thêm / thay đổi các yêu cầu, các yêu cầu sửa đổi sẽ được cài đặt hoặc cập nhật.

Nếu bạn không muốn chọn các yêu cầu một cách tương tác, bạn có thể chuyển chúng đến lệnh.

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

Mặc dù đúng là composer updatecài đặt các gói mới được tìm thấy trong composer.json, nhưng nó cũng sẽ cập nhật tệp composer.lock và mọi gói đã cài đặt theo bất kỳ logic mờ nào ( >hoặc *ký tự sau dấu hai chấm) được tìm thấy trong composer.json! Điều này có thể tránh được bằng cách sử dụng composer update vendor/package, nhưng tôi không khuyên bạn nên tạo thói quen cho nó, vì bạn là một đối số bị lãng quên khỏi một dự án có khả năng bị phá vỡ.

Giữ mọi thứ lành mạnh và gắn bó với composer require vendor/packageviệc thêm phụ thuộc mới! 😉


Nhưng sẽ sử dụng composer requirecập nhật tệp composer.lock?
Phil

2

Trường hợp sử dụng của tôi đơn giản hơn, và chỉ đơn giản là phù hợp với tiêu đề của bạn nhưng không phải là chi tiết của bạn.

Đó là, tôi muốn cài đặt một gói mới chưa có trong tôi composer.jsonmà không cập nhật tất cả các gói khác.

Giải pháp ở đây là composer require x/y


1

Trong trường hợp của tôi, tôi đã có một repo với:

  • yêu cầu A, B, C, D trong .json
  • nhưng chỉ có A, B, C trong .lock

Trong khi đó, A, B, C có các phiên bản mới hơn đối với khóa được tạo.

Vì một số lý do, tôi đã xóa "nhà cung cấp" và muốn thực hiện composer installvà thất bại với thông báo:

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.

Tôi đã cố chạy giải pháp từ Seldaek khi phát hành composer update vendorD/libraryDnhưng nhà soạn nhạc khăng khăng cập nhật nhiều thứ hơn, vì vậy .lockcó quá nhiều thay đổi đã thấy công cụ git của tôi.

Giải pháp tôi đã sử dụng là:

  1. Xóa tất cả các vendorsthư mục.
  2. Tạm thời loại bỏ các yêu cầu VendorD/LibraryDtừ .json.
  3. chạy composer install.
  4. Sau đó xóa tệp .jsonvà kiểm tra lại từ repo (tương đương với việc thêm lại tệp, nhưng tránh thay đổi khoảng trắng tiềm năng).
  5. Sau đó chạy giải pháp của Seldaek composer update vendorD/libraryD

Nó đã cài đặt thư viện, nhưng ngoài ra, gitdiff cho tôi thấy rằng .lockchỉ có những thứ mới được thêm vào mà không cần chỉnh sửa những thứ khác.

(Thnx Seldaek cho con trỏ;))


đó là một quá mức cần thiết. chỉ cần xóa tập tin khóa và chạy cài đặt composer. nó hoạt động
astroanu

6
Điều đó vẫn đúng với các môi trường không chuyên nghiệp, nơi bạn có thể vui vẻ xây dựng lại các phụ thuộc và nếu có gì đó phá vỡ bạn hãy đi và sửa nó. Nhưng nếu đối với bạn, các máy chủ không thành công có nghĩa là bạn mất 10.000 đô la mỗi giờ, thì bạn không nghi ngờ rằng composer.lockkhông bao giờ nên vui vẻ xóa và xây dựng lại. .locklà ... để khóa !! ; D - nếu không thì tệp khóa sẽ vô dụng và bạn sẽ không cam kết nó hoặc nó hoàn toàn không tồn tại. Nếu bạn điều hành trong một công ty định hướng chất lượng và xây dựng lại và cam kết khóa với 1.000 phụ thuộc, tất cả chúng sẽ thay đổi, và người QA sẽ đến giết bạn hahaha.
Xavi Montero

2
Xin chào @astroanu chỉ cần làm rõ rằng nếu bạn đã cài đặt một phụ thuộc vào một ngày trước đó và một số phụ thuộc của nó đã lấy phiên bản mới nhất của dev master thì có thể có vấn đề quan trọng trong việc xóa composer.lock và chỉ cần nhấn cài đặt. Nếu bạn chưa có cơ hội xác minh tác động của việc giới thiệu một phụ thuộc thì có khả năng dẫn đến kết quả không mong muốn và có thể tạo ra trải nghiệm kém cho người dùng.
dkcwd

Tất nhiên, xóa tệp khóa và chạy cài đặt / cập nhật hoặc chạy cập nhật ngay cả khi không xóa tệp khóa sẽ ảnh hưởng đến sự ổn định của ứng dụng. Cập nhật trình soạn thảo chỉ nên chạy trên môi trường dev. Khi sản xuất luôn sử dụng cài đặt trình soạn thảo vì bản dựng sản xuất được kiểm tra đối với những gì được lưu trên tệp khóa.
astroanu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.