問題描述
Composer 可以選擇僅在開發過程中加載多個依賴項,因此這些工具不會安裝在生產中(在實時服務器上).這(理論上)對于僅在開發中有意義的腳本非常方便,例如測試、假數據工具、調試器等.
Composer has the option to load several dependencies only while being in development, so the tools will not be installed in production (on the live server). This is (in theory) very handy for scripts that only make sense in development, like tests, fake-data-tools, debugger, etc.
要走的路是添加一個額外的 require-dev
塊,其中包含您在 dev 中需要的工具:
The way to go is to add an additional require-dev
block with the tools you need in dev:
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
然后(理論上)通過
composer install --dev
問題&問題:
Composer 在 2013 年顯著改變了 install
和 update
的行為,require-dev
-dependencies 現在默認安裝(!), 隨意創建一個帶有 require-dev
塊的 composer.json 并執行 composer install
來重現.
Problem & Question:
Composer has changed the behaviour of install
and update
dramatically in 2013, require-dev
-dependencies are now installed by default (!), feel free to create a composer.json with a require-dev
block and perform an composer install
to reproduce.
最普遍的部署方式是推送 composer.lock(保存您當前的 composer 設置),然后在生產服務器上執行 composer install
,這也將安裝開發的東西.
As the most accepted way to deploy is to push the composer.lock (that holds your current composer setup) and then do an composer install
on the production server, this will also install the development stuff.
安裝 -dev 依賴項的正確部署方法是什么?
What's the correct way to deploy this without installing the -dev dependencies ?
注意:我試圖在這里創建一個規范的問答來澄清奇怪的 Composer 部署.隨意編輯這個問題.
推薦答案
為什么
恕我直言,現在 Composer 將默認使用 --dev
標志(在安裝 和 更新時)是有充分理由的.Composer 主要在需要這種行為的場景中運行:
There is IMHO a good reason why Composer will use the --dev
flag by default (on install and update) nowadays. Composer is mostly run in scenario's where this is desired behavior:
基本的 Composer 工作流程如下:
The basic Composer workflow is as follows:
- 啟動一個新項目:
composer.phar install --dev
,將json和lock文件提交給VCS. - 其他開發人員開始參與該項目:簽出 VCS 和
composer.phar install --dev
. - 開發者添加依賴:
composer.phar require
,如果你想要require-dev
中的包,添加--dev
代碼>部分(并提交). - 其他人繼續:(結帳和)
composer.phar install --dev
. - 開發人員想要更新版本的依賴項:
composer.phar update --dev
(并提交). - 其他人繼續:(結帳和)
composer.phar install --dev
. - 項目已部署:
composer.phar install --no-dev
- A new project is started:
composer.phar install --dev
, json and lock files are commited to VCS. - Other developers start working on the project: checkout of VCS and
composer.phar install --dev
. - A developer adds dependancies:
composer.phar require <package>
, add--dev
if you want the package in therequire-dev
section (and commit). - Others go along: (checkout and)
composer.phar install --dev
. - A developer wants newer versions of dependencies:
composer.phar update --dev <package>
(and commit). - Others go along: (checkout and)
composer.phar install --dev
. - Project is deployed:
composer.phar install --no-dev
如您所見,--dev
標志的使用(遠)多于 --no-dev
標志,尤其是當開發人員的數量較多時項目成長.
As you can see the --dev
flag is used (far) more than the --no-dev
flag, especially when the number of developers working on the project grows.
生產部署
在不安裝dev"的情況下部署它的正確方法是什么?依賴?
What's the correct way to deploy this without installing the "dev" dependencies?
好吧,composer.json
和 composer.lock
文件應該提交給 VCS.不要省略 composer.lock
,因為它包含有關應該使用的包版本的重要信息.
Well, the composer.json
and composer.lock
file should be committed to VCS. Don't omit composer.lock
because it contains important information on package-versions that should be used.
在執行生產部署時,您可以將 --no-dev
標志傳遞給 Composer:
When performing a production deploy, you can pass the --no-dev
flag to Composer:
composer.phar install --no-dev
composer.lock
文件可能包含有關開發包的信息.這沒關系.--no-dev
標志將確保未安裝這些開發包.
The composer.lock
file might contain information about dev-packages. This doesn't matter. The --no-dev
flag will make sure those dev-packages are not installed.
當我說生產部署"時,我指的是旨在用于生產的部署.我不是在爭論 composer.phar install
是否應該在生產服務器上完成,或者在可以審查事情的臨時服務器上完成.這不是這個答案的范圍.我只是指出如何在不安裝dev"的情況下composer.phar install
依賴.
When I say "production deploy", I mean a deploy that's aimed at being used in production. I'm not arguing whether a composer.phar install
should be done on a production server, or on a staging server where things can be reviewed. That is not the scope of this answer. I'm merely pointing out how to composer.phar install
without installing "dev" dependencies.
離題
--optimize-autoloader
標志在生產環境中也可能是可取的(它會生成一個類映射來加速應用程序的自動加載):
The --optimize-autoloader
flag might also be desirable on production (it generates a class-map which will speed up autoloading in your application):
composer.phar install --no-dev --optimize-autoloader
或者在自動部署完成后:
Or when automated deployment is done:
composer.phar install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --optimize-autoloader
如果您的代碼庫支持它,您可以將 --optimize-autoloader
換成 --classmap-authoritative
.更多信息這里
If your codebase supports it, you could swap out --optimize-autoloader
for --classmap-authoritative
. More info here
這篇關于使用 Composer 的開發/生產切換時如何正確部署?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!