Sự khác biệt giữa phần yêu cầu và yêu cầu-dev trong composer.json là gì?


99

Tôi đang bắt đầu sử dụng trình soạn nhạc, tôi biết rất ít về nó và có một chút kinh nghiệm về phát triển ứng dụng web.

Tôi vừa xem qua Nettuts + Tutorial , vì vậy tôi có câu hỏi cơ bản về nhà soạn nhạc.

{
  "require": {
    "laravel/framework": "4.0.*",
    "way/generators": "dev-master",
    "twitter/bootstrap": "dev-master",
    "conarwelsh/mustache-l4": "dev-master"
  },
  "require-dev": {
    "phpunit/phpunit": "3.7.*",
    "mockery/mockery": "0.7.*"
  },
  "autoload": {
    "classmap": [
      "app/commands",
      "app/controllers",
      "app/models",
      "app/database/migrations",
      "app/database/seeds",
      "app/tests/TestCase.php"
    ]
  },
  "scripts": {
    "post-update-cmd": "php artisan optimize"
  },
  "minimum-stability": "dev"
}
  1. Bất cứ thứ gì xuất hiện trong "require-dev"một phần, sẽ chỉ được tải xuống và cài đặt với composer install --dev?
  2. Tôi đọc một số tài liệu của nhà soạn nhạc nhưng vẫn không hiểu lý do chúng tôi "require-dev"tham gia là gì? Có phải vì chúng tôi muốn nhận phiên bản cụ thể của gói thay vì luôn nhận được phiên bản ổn định mới nhất không?

Câu trả lời:


115

Môi trường khác nhau

Thông thường, phần mềm sẽ chạy trong các môi trường khác nhau:

  • development
  • testing
  • staging
  • production

Sự phụ thuộc khác nhau trong các môi trường khác nhau

Các phần phụ thuộc được khai báo trong requirephần của composer.jsonthường là các phần phụ thuộc được yêu cầu để chạy một ứng dụng hoặc một gói trong

  • staging
  • production

môi trường, trong khi các phụ thuộc được khai báo trong require-devphần này thường là các phụ thuộc được yêu cầu trong

  • developing
  • testing

các môi trường.

Ví dụ: ngoài các gói được sử dụng để thực sự chạy một ứng dụng, các gói có thể cần thiết để phát triển phần mềm, chẳng hạn như:

  • friendsofphp/php-cs-fixer (để phát hiện và khắc phục các vấn đề về kiểu mã hóa)
  • squizlabs/php_codesniffer (để phát hiện và khắc phục các vấn đề về kiểu mã hóa)
  • phpunit/phpunit (để thúc đẩy sự phát triển bằng cách sử dụng các thử nghiệm)
  • Vân vân.

Triển khai

Bây giờ, trong developmenttestingmôi trường, bạn thường sẽ chạy

$ composer install

để cài đặt cả hai productionvà các developmentphụ thuộc.

Tuy nhiên, trong stagingproductionmôi trường, bạn chỉ muốn cài đặt các phụ thuộc cần thiết để chạy ứng dụng và là một phần của quá trình triển khai, bạn thường sẽ chạy

$ composer install --no-dev

để chỉ cài đặt các phần productionphụ thuộc.

Ngữ nghĩa

Nói cách khác, các phần

  • require
  • require-dev

cho biết composergói nào nên được cài đặt khi bạn chạy

$ composer install

hoặc là

$ composer install --no-dev

Đó là tất cả.

Lưu ý Phần phụ thuộc phát triển của gói ứng dụng hoặc gói phụ thuộc của bạn sẽ không bao giờ được cài đặt

Để tham khảo, hãy xem:


Tôi có hiểu đúng không, rằng sẽ không có vấn đề gì nếu tôi "triển khai" bằng cách tải lên toàn bộ vendorthư mục qua FTP?
pilat

2
@pilat Bạn có thể, nhưng hãy đảm bảo cài đặt bằng —no-dev. Ngoài ra, FTP có thể sẽ khá chậm.
localheinz

Còn về các phụ thuộc mà bạn cần để xây dựng ứng dụng của mình thì sao? Vì vậy, trong một đường ống xây dựng và triển khai, tôi muốn cài đặt chúng để xây dựng và sau đó gỡ bỏ chúng một lần nữa trước khi triển khai. Ví dụ: thu nhỏ hoặc chuyển LESS / SASS thành css. Bạn làm điều đó như thế nào?
Richard Kiefer

1
@RichardKiefer Một số người sử dụng phar.io , những người khác kiểm tra PHAR, nhưng những người khác sử dụng hình ảnh Docker và cũng có một số người sử dụng hình ảnh riêng biệt composer.json- xem ví dụ: github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools .
localheinz

Vì vậy, bạn sẽ chỉ cam kết composer.json và khóa vào kho của bạn? Không có ý nghĩa hơn khi cam kết mọi thứ và để triển khai chỉ cần kéo nhánh chính từ quá trình sản xuất bằng cách sử dụng git?
mbomb007

61
  1. Theo sách hướng dẫn của nhà soạn nhạc :

    request-dev (root-only)

    Liệt kê các gói cần thiết để phát triển gói này hoặc đang chạy thử nghiệm, v.v. Các yêu cầu dành cho nhà phát triển của gói gốc được cài đặt theo mặc định. Cả hai installhoặc updatehỗ trợ --no-devtùy chọn ngăn cài đặt phụ thuộc nhà phát triển.

    Vì vậy, chạy composer installcũng sẽ tải xuống các phụ thuộc phát triển.

  2. Lý do thực sự khá đơn giản. Khi đóng góp vào một thư viện cụ thể, bạn có thể muốn chạy các bộ thử nghiệm hoặc các công cụ phát triển khác (ví dụ: symfony). Nhưng nếu bạn cài đặt thư viện này vào một dự án, những phụ thuộc phát triển đó có thể không bắt buộc: không phải mọi dự án đều yêu cầu người chạy thử nghiệm.


19

Từ trang web của nhà soạn nhạc (đủ rõ ràng)

yêu cầu #

Liệt kê các gói theo yêu cầu của gói này. Gói sẽ không được cài đặt trừ khi có thể đáp ứng các yêu cầu đó.

request-dev (root-only) #

Liệt kê các gói cần thiết để phát triển gói này hoặc đang chạy thử nghiệm, v.v. Các yêu cầu dành cho nhà phát triển của gói gốc được cài đặt theo mặc định. Cả cài đặt hoặc cập nhật đều hỗ trợ tùy chọn --no-dev để ngăn cài đặt các phần phụ thuộc của nhà phát triển.

Sử dụng request-dev trong Composer, bạn có thể khai báo các phụ thuộc bạn cần để phát triển / thử nghiệm dự án nhưng không cần trong sản xuất. Khi bạn tải dự án lên máy chủ sản xuất (sử dụng git), require-devphần này sẽ bị bỏ qua.

Cũng kiểm tra câu trả lời này được đăng bởi tác giảbài đăng này .


3
Vui lòng giải thích cho tôi lý do tại sao "way / Generators": "dev-master" lại nằm trong phần "Request" ?, Tôi sẽ không cần nó trong quá trình sản xuất nữa.
Artisan

1
Đây là một phỏng đoán tổng thể, nhưng điều duy nhất tôi có thể nghĩ là bởi vì way / Generators được thêm vào như một nhà cung cấp dịch vụ, nếu nó bị thiếu trong môi trường sản xuất, Laravel sẽ không hoạt động.
Daniel Hollands

2
Phần Các yêu cầu dành cho nhà phát triển của gói gốc được cài đặt theo mặc định nói rõ rằng các bản tải xuống từ Yêu cầu-dev được cài đặt, ngay cả trên máy chủ sản xuất.
Gemmu

3
Ý tưởng là bạn sẽ sử dụng cờ --no-dev khi sản xuất.
John Pancoast

2

Phần yêu cầu Phần này chứa các gói / phần phụ thuộc là những ứng cử viên tốt hơn để được cài đặt / bắt buộc trong môi trường sản xuất.

Phần request-dev: Phần này chứa các gói / phụ thuộc mà nhà phát triển có thể sử dụng để kiểm tra mã của cô ấy (hoặc để thử nghiệm trên máy cục bộ của cô ấy và cô ấy không muốn các gói này được cài đặt trên môi trường sản xuất).


1

Nguyên tắc chung là bạn chỉ muốn các gói từ phần request-dev trong môi trường phát triển (dev), ví dụ như môi trường cục bộ.

Các gói trong phần request-dev là các gói giúp bạn gỡ lỗi ứng dụng, chạy thử nghiệm, v.v.

Tại môi trường dàn dựngsản xuất, bạn có thể chỉ muốn các gói từ phần yêu cầu .

Nhưng dù sao thì bạn cũng có thể chạy cài đặt composer --no-devcomposer update --no-dev trên mọi môi trường, lệnh sẽ chỉ cài đặt các gói từ phần được yêu cầu chứ không phải từ request-dev , nhưng có thể bạn chỉ muốn chạy phần này ở giai đoạn dàn dựngsản xuất môi trường không trên cục bộ.

Về mặt lý thuyết, bạn có thể đặt tất cả các gói trong phần yêu cầu và sẽ không có gì xảy ra, nhưng bạn không muốn phát triển các gói ở môi trường sản xuất vì những lý do sau:

  1. tốc độ
  2. tiềm năng tiết lộ một số thông tin gỡ lỗi
  3. Vân vân

Một số ứng cử viên tốt cho request-dev là:

"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0"

bạn có thể thấy các gói trên đang làm gì và bạn sẽ thấy lý do tại sao bạn không cần chúng khi sản xuất.

Xem thêm tại đây: https://getcomposer.org/doc/04-schema.md

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.