PHP專案中composer和Git的組合使用

世有因果知因求果發表於2015-05-30

highlight: 在國內由於眾所周知的原因,composer的package可能無法訪問,解決辦法是使用中國的全映象:

composer config -g repositories.packagist composer http://packagist.phpcomposer.com

 

在需要使用composer package的地方建立composer.json:

{

  "name": "kidsit/myphppackage",

      "type": "wordpress plugin",

"repositories": [

  "type": "vcs",

"url": "git@github.com/kidsit/myphppackage.git"

],

"autoload": [

  "files" :["vendor/kidsit/myphppacakge/packge-autoload.php" ]

]

}

隨後就可以通過composer install來安裝這個放在github上面的package了。

但是如果我們又希望能夠直接在專案中開發變更該package,並且直接git push的話怎麼操作呢?

這時composer的一個選項就非常重要了 --prefer-source,執行:

composer install --prefer-source,

這時composer則直接將上述存放於github中的package repo下載下來放到你的專案目錄中,這樣你既可以使用composer的依賴管理及PHP autoload功能,又能使用Git及Github的版本控制功能。

如果我們要安裝laravel,同時又要考慮將來的laravel的小版本升級問題,又要考慮自己寫的程式碼的邏輯分層維護問題:比如將分為backend,frontend分別作為兩個repo來管理,應該如何做呢?

1.在自己的github目錄fork一個laravel repo;

2.composer create-project laravel/laravel learning-laravel5 dev-develop ----repository-url 指定用你的repo來安裝laravel

注意:上述--reposityory-url是一個packages.json的連結,該檔案中,你可以指定require的package,url指向你fork過來的laravel repo

在這裡綜合使用composer的package manage/dependency management的強大功能以及git的版本控制功能,既按照我們的定製化要求安裝了laravel初始專案(從我們指定forked repo來安裝),又為後續準備初始專案repo打好了基礎。

3.將該目錄中的專案開發push到專案repo中;在上面第2.步中,由於有很多原始laravel專案的歷史資訊,我們是不希望看到的,有以下方法可以參考:

http://stackoverflow.com/questions/9683279/make-the-current-commit-the-only-initial-commit-in-a-git-repository

git checkout --orphan newBranch  ==該命令使用--orphan來建立新的branch後,歷史資訊就會丟失??並且所有檔案都處於unstaged的狀態
git add -A  # Add all files and commit them ==將所有檔案入庫
git commit 
git branch -D master  # Deletes the master branch 
git branch -m master  # Rename the current branch to master ==》將新的branch更名為master
git push newprojectrepo master #該命令就將建立我們自己的專案repo,而且在專案repo中就只有一條歷史記錄了!!!可能需要--force引數,因為祖先有些混亂了!
再隨後,專案組成員就直接git clone newprojectrepo,看到清爽的只有自己工作相關的commits。
再隨後,專案repo又可以pull我們fork過來的laravel新的bugfix更新

 上面連結中另外一種方案是直接獲取forked laravel repo後將.git資料夾刪除,重新init repo,不知道這種方案是否可行,特別是將來需要pull時,是否能夠自動merge?

另外一篇文章也可參考pull時合併得到一個commit:

http://eli.thegreenplace.net/2014/02/19/squashing-github-pull-requests-into-a-single-commit

 

4.在該目錄做專案開發,可以考慮以git subtree來將前後臺分離,前臺可以獨立出去作為子專案來開發,另創一個前臺repo;

5.當laravel升級時,可以通過反向pull request,將fork過來的laravel repo做update,隨後在專案中建立一個臨時toupgradelaravelbranch, git pull操作在這個branch上更新laravel,隨後在master branch上,直接git merge toupgradelaravelbranch --squash,最後git commit -m"upgrade laravel from 4.1 to 4.2", git push,這時專案就自動升級了laravel(注意如果是大的版本升級的話,可能需要好好測測,甚至API,目錄結構都變掉了),同時保持了專案歷史的純潔性;

6.更新laravel的專案做好測試後,push到專案repo中,供team分享使用;

。。。

單獨require一個package的方法: 

composer require laracasts/utilities:~2.0

相關文章