Làm cách nào để triển khai chính xác khi sử dụng công tắc phát triển / sản xuất của Compoder?


180

Trình soạn thảo có tùy chọn tải một số phụ thuộc chỉ trong khi đang phát triển, vì vậy các công cụ sẽ không được cài đặt trong sản xuất (trên máy chủ trực tiếp). Điều này (về lý thuyết) rất tiện dụng cho các tập lệnh chỉ có ý nghĩa trong phát triển, như kiểm tra, công cụ dữ liệu giả, trình gỡ lỗi, v.v.

Cách để đi là thêm một require-devkhối bổ sung với các công cụ bạn cần trong dev:

"require-dev": {
    "codeception/codeception": "1.6.0.3"
}

và sau đó (về mặt lý thuyết) tải các phụ thuộc này thông qua

composer install --dev

Vấn đề & Câu hỏi:

Trình soạn thảo đã thay đổi hành vi installupdateđột ngột vào năm 2013, require-dev-depencies hiện được cài đặt theo mặc định (!), Vui lòng tạo một composer.json với một require-devkhối và thực hiện composer installtái tạo.

Như cách được chấp nhận nhất để triển khai là đẩy nhà soạn nhạc. khóa (giữ thiết lập trình soạn thảo hiện tại của bạn) và sau đó thực hiện composer installtrên máy chủ sản xuất, điều này cũng sẽ cài đặt công cụ phát triển.

Cách chính xác để triển khai điều này mà không cần cài đặt các phụ thuộc -dev là gì?

Lưu ý: Tôi đang cố gắng tạo Q / A chính tắc ở đây để làm rõ việc triển khai Trình soạn thảo kỳ lạ. Hãy chỉnh sửa câu hỏi này.


@all: Không biết tiền thưởng ở đâu :( Tôi sẽ bắt đầu một cách tiếp cận khác
Sliq

1
Nếu bạn không chủ động trao giải, và không có câu trả lời nào được chấp nhận hoặc nhận đủ số lượt ủng hộ, không ai nhận được tiền thưởng.
Sven

2
Cá nhân tôi không thích cách tiếp cận này chút nào. Không composer.lockbao giờ nên được thêm vào repo Git, KHÔNG BAO GIỜ. Cách tiếp cận đúng là sử dụng cập nhật của nhà soạn nhạc về dàn dựng và sau đó đồng bộ tệp vào sản xuất (tất nhiên mọi thứ đều hoạt động). Dàn dựng phải là bản sao chính xác của môi trường sản xuất. composer.locknên là một phần của .gitignore.
danh từ

6
composer.lock chắc chắn được đưa vào CSV của bạn !!! Làm thế nào khác bạn chắc chắn rằng tất cả mọi người sử dụng cùng một phiên bản ?? Vì vậy, KHÔNG BAO GIỜ loại trừ composer.lock khỏi CSV của bạn !!!
Tobias Gaertner

3
@TobiasGaertner Tôi nghĩ bạn có nghĩa là VCS (phần mềm kiểm soát phiên bản), nhưng nếu không thì bạn đã đúng và phù hợp với các khuyến nghị chính thức của dự án .
Xiong Chiamiov

Câu trả lời:


327

Tại sao

IMHO có một lý do chính đáng tại sao Trình soạn thảo sẽ sử dụng --devcờ theo mặc định (khi cài đặt cập nhật) ngày nay. Nhà soạn nhạc chủ yếu chạy trong kịch bản trong đó đây là hành vi mong muốn:

Quy trình soạn thảo cơ bản như sau:

  • Một dự án mới được bắt đầu: composer.phar install --dev , json và các tệp khóa được cam kết với VCS.
  • Các nhà phát triển khác bắt đầu làm việc với dự án: kiểm tra VCS và composer.phar install --dev .
  • Nhà phát triển thêm phụ thuộc : composer.phar require <package>, thêm --devnếu bạn muốn gói trongrequire-dev phần (và cam kết).
  • Những người khác đi cùng: (thanh toán và) composer.phar install --dev .
  • Một nhà phát triển muốn các phiên bản phụ thuộc mới hơn: composer.phar update --dev <package> (và cam kết).
  • Những người khác đi cùng: (thanh toán và) composer.phar install --dev .
  • Dự án được triển khai: composer.phar install --no-dev

Như bạn có thể thấy --devcờ được sử dụng (xa) nhiều hơn--no-dev cờ, đặc biệt là khi số lượng nhà phát triển làm việc trong dự án tăng lên.

Triển khai sản xuất

Cách chính xác để triển khai điều này mà không cần cài đặt các phụ thuộc "dev" là gì?

Chà, tập tin composer.jsoncomposer.locknên được cam kết với VCS. Đừng bỏ qua composer.lockvì nó chứa thông tin quan trọng về các phiên bản gói nên được sử dụng.

Khi thực hiện triển khai sản xuất, bạn có thể chuyển --no-devcờ cho Trình soạn thảo:

composer.phar install --no-dev

Các composer.locktập tin có thể chứa thông tin về các gói dev. Điều này không thành vấn đề. Các --no-devlá cờ sẽ đảm bảo những dev-gói không được cài đặt.

Khi tôi nói "triển khai sản xuất", ý tôi là một triển khai nhằm mục đích sử dụng trong sản xuất. Tôi không tranh luận liệu composer.phar installnên thực hiện trên máy chủ sản xuất hay trên máy chủ dàn dựng, nơi mọi thứ có thể được xem xét. Đó không phải là phạm vi của câu trả lời này. Tôi chỉ đang chỉ ra làm thế nào đểcomposer.phar install không cài đặt phụ thuộc "dev".

Đề ra

Các --optimize-autoloaderlá cờ cũng có thể được mong muốn về sản xuất (nó tạo ra một lớp bản đồ đó sẽ tăng tốc độ tự động load trong ứng dụng của bạn):

composer.phar install --no-dev --optimize-autoloader

Hoặc khi triển khai tự động được thực hiện:

composer.phar install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --no-suggest --optimize-autoloader

Nếu codebase của bạn hỗ trợ nó, bạn có thể trao đổi trên --optimize-autoloadercho --classmap-authoritative. Thêm thông tin ở đây


5
Tôi đồng ý với hầu hết những gì được nói với một ngoại lệ. "Trình soạn thảo cài đặt --no-dev" chỉ nên được thực hiện trong môi trường dàn dựng và môi trường đó nên được coi là bất biến. Tôi sẽ không muốn có bất kỳ sự phụ thuộc nào được tải xuống trực tiếp tại máy chủ sản xuất của mình và không qua phần xem trước / dàn dựng. Đó chỉ là một chút thận trọng.
Có thể mở rộng

3
@Scalable: Mặc dù tôi đồng ý với bạn (và Sven bao gồm điều này một cách độc đáo trong câu trả lời của anh ấy), đó không phải là phạm vi câu trả lời của tôi, và không phải ý tôi muốn nói với "triển khai sản xuất". Tôi đã thêm một đoạn để làm rõ điều đó.
Jasper N. Brouwer

5
Thật ra tôi nghĩ rằng mặc định nên là lựa chọn ít nguy hiểm hơn. Làm cho - mặc định và vô tình thực hiện cài đặt trình soạn thảo trong sản xuất có thể gây tử vong.
Hector Ordonez

3
Điểm tốt trong --optimize-autoloader. Cũng xem xét --classmap-authoritative- Từ tài liệu ở đây getcomposer.org/doc/03-cli.md bạn có thể thấy điều này: "Chỉ tự động tải các lớp từ sơ đồ lớp. ở đó ", điều có lẽ sẽ xảy ra trong môi trường prod của bạn trừ khi bạn tạo các lớp một cách linh hoạt.
Xavi Montero

6
Câu trả lời tuyệt vời, tôi sẽ đề nghị thêm optimize-autoloadertrực tiếp vào composer.json:{"config": { "optimize-autoloader": true } }
Yvan

79

Trên thực tế, tôi rất khuyến nghị LẠI cài đặt phụ thuộc vào máy chủ sản xuất.

Đề nghị của tôi là kiểm tra mã trên máy triển khai, cài đặt các phụ thuộc khi cần thiết (điều này bao gồm KHÔNG cài đặt phụ thuộc dev nếu mã đi vào sản xuất), sau đó di chuyển tất cả các tệp sang máy đích.

Tại sao?

  • trên lưu trữ được chia sẻ, bạn có thể không nhận được một dòng lệnh
  • ngay cả khi bạn đã làm, PHP có thể bị hạn chế ở đó về các lệnh, bộ nhớ hoặc truy cập mạng
  • Các công cụ CLI của kho lưu trữ (Git, Svn) có thể chưa được cài đặt, sẽ không thành công nếu tệp khóa của bạn đã ghi lại một phụ thuộc để kiểm tra một cam kết nhất định thay vì tải xuống cam kết đó dưới dạng ZIP (bạn đã sử dụng --prefer-source hoặc Composer không có cách nào khác để có được phiên bản đó)
  • nếu máy sản xuất của bạn giống một máy chủ thử nghiệm nhỏ hơn (ví dụ như vi thể Amazon EC2) thì có lẽ không đủ bộ nhớ được cài đặt để thực thi composer install
  • trong khi nhà soạn nhạc cố gắng không phá vỡ mọi thứ, bạn cảm thấy thế nào về việc kết thúc với một trang web sản xuất bị hỏng một phần vì một số phụ thuộc ngẫu nhiên không thể được tải trong giai đoạn cài đặt của Nhà soạn nhạc

Câu chuyện dài: Sử dụng Trình soạn thảo trong môi trường bạn có thể kiểm soát. Máy phát triển của bạn đủ điều kiện vì bạn đã có tất cả những thứ cần thiết để vận hành Trình soạn thảo.

Cách chính xác để triển khai điều này mà không cần cài đặt các phụ thuộc -dev là gì?

Lệnh sử dụng là

composer install --no-dev

Điều này sẽ hoạt động trong mọi môi trường, có thể là máy chủ sản xuất hoặc máy triển khai hoặc máy phát triển được yêu cầu kiểm tra lần cuối để xem liệu có yêu cầu phát triển nào được sử dụng không chính xác cho phần mềm thực hay không.

Lệnh sẽ không cài đặt hoặc chủ động gỡ cài đặt, các yêu cầu dev được khai báo trong tệp composer.lock.

Nếu bạn không quan tâm đến việc triển khai các thành phần phần mềm phát triển trên máy chủ sản xuất, thì việc chạy composer installsẽ thực hiện cùng một công việc, nhưng chỉ cần tăng số lượng byte được di chuyển xung quanh và cũng tạo ra một khai báo trình tải tự động lớn hơn.


14
Quy trình làm việc thú vị, nhưng có một nhược điểm lớn : Các kho lưu trữ không bao giờ nên chứa chính thư mục / nội dung của nhà cung cấp (tuyên bố chính thức trên trang Trình soạn thảo), vì vậy chúng sẽ không bao giờ được đẩy trực tiếp vào sản xuất trong triển khai dựa trên git (là một tiêu chuẩn chung, sửa tôi nếu tôi sai). Vì vậy, về cơ bản, giải pháp trên chỉ hoạt động với triển khai FTP "trường học cũ"!? Xin vui lòng thảo luận thêm về điều này ...
Sliq

17
Quy trình làm việc được đề xuất của tôi không bao gồm việc đẩy mã qua GIT đến máy chủ sản xuất. Trên thực tế, tôi khuyên bạn nên chống lại, bởi vì làm như vậy sẽ buộc bạn phải cài đặt các phần phụ thuộc của Trình soạn thảo trên máy chủ sản xuất, điều này có thể đưa ra bất kỳ số lượng vấn đề nào. Nếu bạn muốn triển khai của mình chạy trơn tru, bạn phải tập hợp tất cả các mã cần thiết để chạy ứng dụng trước khi bạn phá hủy phiên bản hiện tại và thay thế nó. Không thích FTP? RSync thông qua SSH, sau đó chuyển đổi các phiên bản bằng cách lật một liên kết tượng trưng. Nhưng bạn cũng có thể đẩy, kiểm tra và soạn thảo cài đặt trong prod nếu bạn muốn.
Sven

2
@Panique: Tôi vừa thấy một phần bình luận của bạn và tôi phải trả lời: "bị đẩy sang sản xuất trong một triển khai dựa trên git (đó là một tiêu chuẩn chung afaik, hãy sửa tôi nếu tôi sai)" - Không, điều này không phải là tiêu chuẩn chung. Nó chỉ là một cách để làm điều đó.
Sven

1
Nhóm tôi tham gia đã kết hợp điều này vào quy trình làm việc của họ rất thành công. Chúng tôi có một máy xây dựng (tất nhiên là Jenkins), trong đó: 1) kiểm tra từ SC 2) chạy cài đặt / cập nhật của nhà soạn nhạc 3) chạy thử nghiệm đơn vị 4) loại bỏ phụ thuộc dev 5) tạo tệp phar ( app-1.34.pharv.v.). Có một cơ chế riêng biệt được thông báo và quyết định khi nào lấy tệp đó, nơi chuyển nó đến và sau đó phải làm gì với nó. Một số đội chọn giải nén phar một khi nó ở trên máy chủ và một số đội chạy như cũ. Nó cho vay rất nhiều niềm tin vào sự ổn định và khả năng tái tạo của các triển khai của chúng tôi.
Josh Johnson

3
Tôi đồng ý 100% với câu trả lời này. Trình soạn thảo không nên được cài đặt trên máy chủ triển khai, cũng không phải git. Các máy chủ triển khai / tích hợp liên tục được cho là chính xác để quản lý nguồn và phụ thuộc tìm nạp: git pull> cài đặt trình soạn thảo> triển khai
Eric MORAND

4

Bây giờ require-devđược bật theo mặc định, để phát triển cục bộ, bạn có thể làm composer installcomposer updatekhông có --devtùy chọn.

Khi bạn muốn triển khai vào sản xuất, bạn cần đảm bảo composer.lockkhông có gói nào đến từ đó require-dev.

Bạn có thể làm điều này với

composer update --no-dev

Khi bạn đã thử nghiệm cục bộ với --no-devbạn, bạn có thể triển khai mọi thứ để sản xuất và cài đặt dựa trên composer.lock. Bạn cần --no-devtùy chọn lại ở đây, nếu không, nhà soạn nhạc sẽ nói "Tệp khóa không chứa thông tin yêu cầu-dev" .

composer install --no-dev

Lưu ý: Hãy cẩn thận với bất cứ điều gì có khả năng giới thiệu sự khác biệt giữa nhà phát triển và sản xuất! Tôi thường cố gắng tránh yêu cầu dev bất cứ khi nào có thể, vì bao gồm các công cụ dev không phải là một chi phí lớn.


1
Điều này thực sự không chính xác trong các chi tiết. Không cần phải kiểm tra composer.lockphụ thuộc dev. Bạn chỉ cần chạy composer install --no-devvà bạn sẽ chỉ nhận được các phụ thuộc thông thường được cài đặt - trên thực tế, Trình soạn thảo cũng sẽ xóa mọi phụ thuộc dev trong bước này.
Sven

Nếu địa phương của tôi composer.lockcó phụ thuộc dev trong đó (và có khả năng ảnh hưởng đến các phiên bản của gói không dành cho nhà phát triển) thì tôi muốn cập nhật nó để phản ánh cách thức sản xuất. Điều này cũng buộc bạn phải chạy composer install --no-devtrong sản xuất, như composer installsẽ có lỗi. Về mặt kỹ thuật tôi nghĩ bạn đúng; điều này không bắt buộc, nhưng nó là một mức độ an toàn cao hơn, mà tôi thích.
dave1010

Ok, kịch bản demo: Ứng dụng của bạn yêu cầu dev/toolprod/lib:~1.0. Prod / lib mới nhất là 1.3, nhưng dev / tool cũng yêu cầu prod/lib:1.1.*. Kết quả: Bạn sẽ cài đặt phiên bản 1.1.9 (mới nhất của nhánh 1.1.x) và sử dụng nó trong quá trình phát triển của bạn. Tôi sẽ nói rằng KHÔNG an toàn khi chỉ cập nhật --no-dev, do đó bao gồm prod / lib 1.3 mới nhất và giả sử mọi thứ hoạt động mà không cần kiểm tra. Và có lẽ việc kiểm tra là không thể vì thiếu dev / tool. Tôi sẽ giả sử rằng vì dev / tool không cần thiết trong sản xuất, nên không nên triển khai, nhưng phần mềm phải sử dụng prod / lib 1.1.9 sau đó.
Sven

Nếu bạn đang sử dụng --no-dev thì bạn cần kiểm tra nó cục bộ, như tôi đã đề cập trong câu trả lời. Tôi vẫn khuyên bạn không nên sử dụng --no-devtất cả.
dave1010

Vì vậy, về cơ bản, bạn đề nghị này: composer update , sau đó thực hiện một số phát triển, sau đó thực hiện composer update --no-dev, sau đó thực hiện kiểm tra phát hành, sau đó đẩy sang sản xuất và thực hiện composer install --no-dev. Hai vấn đề: 1. Tôi không thể kiểm tra bản phát hành mà không phụ thuộc dev và 2. Tôi không thể cài đặt với ví dụ Git trong sản xuất.
Sven

3

Trên các máy chủ sản xuất tôi đổi tên vendorthành vendor-<datetime>và trong quá trình triển khai sẽ có hai thư mục nhà cung cấp.

Cookie HTTP khiến hệ thống của tôi chọn nhà cung cấp mới autoload.php và sau khi thử nghiệm, tôi thực hiện chuyển đổi hoàn toàn nguyên tử / tức thời giữa chúng để vô hiệu hóa thư mục nhà cung cấp cũ cho tất cả các yêu cầu trong tương lai, sau đó tôi xóa thư mục trước đó vài ngày sau đó.

Điều này tránh mọi vấn đề gây ra bởi bộ đệm hệ thống tập tin mà tôi đang sử dụng trong apache / php và cũng cho phép mọi mã PHP hoạt động tiếp tục sử dụng thư mục nhà cung cấp trước đó.


Mặc dù câu trả lời khác đề nghị chống lại nó, cá nhân tôi chạy composer install trên máy chủ, vì điều này nhanh hơn rsync từ khu vực tổ chức của tôi (một VM trên máy tính xách tay của tôi).

Tôi sử dụng --no-dev --no-scripts --optimize-autoloader. Bạn nên đọc tài liệu cho từng người để kiểm tra xem điều này có phù hợp với môi trường của bạn không.


2

Tôi nghĩ là tốt hơn tự động hóa quá trình:

Thêm tệp composer.lock trong kho git của bạn, đảm bảo bạn sử dụng composer.phar install --no-dev khi bạn phát hành, nhưng trong bạn dev máy bạn có thể sử dụng bất kỳ lệnh soạn nhạc mà không cần lo lắng, điều này không có sẽ đi vào sản xuất, các sản xuất sẽ căn cứ vào các phụ thuộc của nó trong tập tin khóa.

Trên máy chủ, bạn kiểm tra phiên bản hoặc nhãn cụ thể này và chạy tất cả các thử nghiệm trước khi thay thế ứng dụng, nếu các thử nghiệm vượt qua bạn tiếp tục triển khai.

Nếu thử nghiệm phụ thuộc vào phụ thuộc dev, vì nhà soạn nhạc không có phụ thuộc phạm vi thử nghiệm, một giải pháp không thanh lịch có thể được chạy thử nghiệm với phụ thuộc dev ( cài đặt composer.phar ), xóa thư viện nhà cung cấp, chạy cài đặt composer.phar - -không một lần nữa, điều này sẽ sử dụng các phụ thuộc được lưu trong bộ nhớ cache nên nhanh hơn. Nhưng đó là một hack nếu bạn biết khái niệm phạm vi trong các công cụ xây dựng khác

Tự động hóa cái này và quên phần còn lại, đi uống bia :-)

PS.: Như trong phần bình luận @Sven dưới đây, không nên kiểm tra tệp composer.lock, vì điều này sẽ khiến trình soạn thảo cài đặt hoạt động như cập nhật của nhà soạn nhạc.

Bạn có thể thực hiện tự động hóa đó với http://deployer.org/ nó là một công cụ đơn giản.


2
Không cam kết và kiểm tra composer.locksẽ làm cho composer installhành động như thế nào composer update. Vì vậy, các phiên bản bạn triển khai không phải là phiên bản bạn đã phát triển. Điều này có khả năng tạo ra sự cố (và hơn thế nữa là do vấn đề bảo mật được giải quyết gần đây với "thay thế" trong Trình soạn thảo). Bạn KHÔNG BAO GIỜ chạy composer updatekhông giám sát mà không xác minh nó không phá vỡ bất cứ điều gì.
Sven

1
@Sven đây là cách một đề xuất trong cùng một nhận xét để chạy thử nghiệm Đơn vị tự động trước khi triển khai. Nhưng bạn đã đúng, tốt hơn hết là giữ tập tin composer.lock.
Giovanni Silva

Bây giờ điều duy nhất bạn phải giải thích: Làm thế nào để bạn chạy thử nghiệm trên máy chủ mà không phụ thuộc vào dev như PHPUnit?
Sven

Sẽ rất tuyệt, nếu các phụ thuộc, kiểm tra và triển khai được đặt cùng nhau trong một công cụ, như Java Gradle hoặc SBT hoặc thậm chí Maven (maven không tốt lắm). Một công cụ PHP làm cho trình soạn thảo phpunit và triển khai hoạt động cùng nhau. Hoặc thậm chí là một plugin Gradle hoặc Scala SBT để tạo ra những thứ này, vì chúng là các công cụ xây dựng bất khả tri, plugin thậm chí có thể hoạt động với các tài sản như giảm thiểu javascript và biên dịch sass, giảm thiểu css. Ai đó biết gì không?
Giovanni Silva

1
Tất nhiên điều này được thực hiện trong máy chủ để kiểm tra môi trường thực, nhưng không trực tiếp trong trang web vhost, bạn có thể thực hiện việc này trong một thư mục tạm thời tách biệt và chuyển kết quả sang vhost khi thành công
Giovanni Silva
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.