簡體   English   中英

存儲庫部署和Composer:什么工作流程?

[英]Repository deployment and Composer : what workflow?

作為一名PHP開發人員,我發現自己經常使用Composer。 在過去,這是個人項目,所以我沒有太多的問題,但現在與Laravel 4項目需要部署,我很難適應我的工作流程。

我的所有項目都是git存儲庫,因此按照慣例,因為它仍然非常錯誤,像大多數開發人員一樣,我將vendor目錄放在我的.gitignore 現在的問題是:我還使用Git部署到服務器,並且所有邏輯都沒有上傳供應商目錄,因為它沒有被存儲庫跟蹤。

所以我的問題是那些與Composer和Git合作的人比我更長的時間:保持服務器同步的最佳工作流程是什么? 如何跟蹤供應商文件夾而不真正跟蹤它? 我每次使用Composer更新時都嘗試上傳它,但我的一些供應商文件夾非常大,每次更新時我都無法手動上傳30Mb的文件。

我真的不知道,你們是怎么解決這個問題的? 我試圖不忽略vendor文件夾,但Git只是搞砸了,一半被認為是克隆的回購,而且無論如何都被忽略了等等。

更新:請注意,我在共享主機上,因此我無法訪問服務器的終端。

最好的方法是在更新到最新代碼后在服務器上運行composer install 您還應該確保提交composer.lock文件,然后服務器將使用該文件進行安裝(您不應該在服務器上運行composer update )。

Capistrano(或Capifony,如果您使用的是Symfony2)對於使用composer的部署非常有用。 您可以遠程觸發部署,它將獨立運行作曲家安裝,以便站點保持聯機狀態,直到成功部署。 還有許多其他好處,例如保留以前的部署和回滾,在部署之前復制舊供應商,編譯資產等。

我正在服務器上的git post-receive hook中處理這樣的事情。 這沒有經過測試,也可能是錯誤的,但你應該明白這個想法。

#!/bin/bash
# get the updated composer.json
git checkout master -- composer.json

# only do this stuff if composer.json is different
# you could check this manually, or with git or cmp
cp composer.json tmp/composer.json

# may take a minute, but won't take the site down
(cd tmp; composer install --prefer-dist)

# this doesn't seem to be atomic
git checkout -f

# switch vendors over
# this isn't quite an atomic operation, but is very close
# you could probably do it with symlinks and "mv -Tf" to make it atomic
mv vendor vendor.old
mv tmp/vendor vendor

rm -r tmp vendor.old

理想情況下,除了一個單獨的mv之外的所有部署(即在這種情況下是git checkoutcomposer install )將在www之外單獨發生。 如果您在工作樹中有未跟蹤的文件(例如CMS上傳)並且依賴PHP的__FILE__而不解析符號鏈接(由於此PHP錯誤 ),則這不起作用。

這是一個老問題,但萬一有人在尋找解決方案:

我稍微修改了@ dave1010的答案,使用git pull而不是git checkout--force

#!/bin/bash
# get only composer files 
git fetch
git checkout origin/master -- composer.json
git checkout origin/master -- composer.lock

# make sure tmp is empty
rm -rf tmp
mkdir tmp

# copy the composer files to tmp
cp -r vendor tmp/vendor
cp composer.json tmp/composer.json
cp composer.lock tmp/composer.lock

# may take a minute, but won't take the site down
(cd tmp; composer install --no-scripts --verbose; cd ..)

# switch vendors over
rm -rf vendor_old
mv vendor vendor_old
mv tmp/vendor vendor

# update your code
git pull

# run again composer install. This time will print 'Nothing to install or update'
# but will execute pre/post scripts & generate autoload files
composer install --optimize-autoloader

使用capistrano / composer可能有更好的解決方案。 但我更喜歡我的。

您可以使用像jenkins這樣的東西來ftp你的文件,你可以指導jenkins在jenkins服務器上運行composer install然后ftp文件。

這也允許您忽略供應商文件夾。

它確實需要構建服務器,您需要能夠執行命令與構建服務器

關鍵是你的composer.lock文件。 composer.lock會准確跟蹤您安裝的軟件包(和版本)。 部署時,也將composer.lock文件發送到生產服務器,然后只進行編輯器composer update 將安裝所有完全相同的軟件包版本。 使用像Capistrano或Flightplan這樣的部署軟件,您可以使composer update步驟成為流程的一部分,以便自動進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM