3,composer.json檔案

weixin_33890526發表於2017-05-26

本文以laravel 5.4 為例

{
    //  閱讀解析於 2017.05.25
    //  by Object
    //  
    //  以下key中的dev指的是開發狀態下,如require-dev和autoload-dev都指開發狀態下的自動匯入和依賴
    //  dev狀態並不衝突非dev狀態
    //
    "name": "laravel/laravel", // 專案名稱
    "description": "The Laravel Framework.", // 描述
    "keywords": ["framework", "laravel"], // 關鍵詞
    "license": "MIT", // 許可協議
    "type": "project", // 型別
    // 釋出狀態時的依賴
    "require": { 
        "php": ">=5.6.4", // PHP版本
        "barryvdh/laravel-debugbar": "^2.3", // laravel除錯皮膚元件,類似於TP的trace
        "erusev/parsedown": "^1.6", // php的markdown元件
        "laravel/framework": "5.4.*", // laravel框架,5.4版本
        "laravel/passport": "^2.0", // laravel框架第三方登入的服務端元件
        "laravel/tinker": "~1.0", // laravel的REPL支援
        "league/html-to-markdown": "^4.4", // PHP的html和markdown互相轉變的元件
        "naux/auto-correct": "^1.0", // 自動給中英文之間加入合理的空格並糾正專用名詞大小寫
        "orangehill/iseed": "^2.3", // 根據現有資料庫生成遷移檔案的元件
        "overtrue/laravel-lang": "^3.0", // 對laravel5的52種語言支援的元件
        "predis/predis": "^1.1", // php互動redis的元件
        "suin/php-rss-writer": "^1.5", // PHP 5.4 的簡單RSS編輯器庫
        "tom-lingham/searchy": "^2.0",// PHP基於Mysql的模糊查詢工具
        "zgldh/qiniu-laravel-storage": "^0.6.3" // laravel 5 的七牛雲sdk
    },
    // 開發狀態時的依賴
    "require-dev": { 
        "barryvdh/laravel-ide-helper": "^2.3", // 在生成Facade的同時自動生成PHPDocs的元件
        "fzaninotto/faker": "~1.4", // PHP用於生成假資料的元件
        "mockery/mockery": "0.9.*", // PHPUnit單元測試Mock元件
        "phpunit/phpunit": "~5.7", // PHP單元測試測試框架
        "symfony/css-selector": "3.1.*", // css選擇器元件
        "symfony/dom-crawler": "3.1.*" // PHP dom元件
    },
    // 自動載入
    "autoload": {
        // 類圖載入模式,即建立檔案和類的自動關係
        // 如下面的定義,表示指定了database資料夾
        // 當composer在 install/update 的時候,會掃描去掃描database資料夾下的所有.php、.inc檔案,將它們內建的類載入進來
        "classmap": [
            "database"
        ],
        // psr-4 / psr-0
        // FIG組織制定的一組PHP相關規範,簡稱PSR,其中:
        // PSR-0:自動載入
        // PSR-1:基本程式碼規範
        // PSR-2:程式碼樣式
        // PSR-3:日誌介面
        // PSR-4:自動載入
        // 目前就這五個規範,乍一看,PSR-0和PSR-4是重複了
        // 他們雖然功能有所重複,但實際上區別還是有的
        // PSR-4的規範比較乾淨,不再相容PHP5.3以前的版本,有一點PSR-0升級版的感覺
        // 當然,PSR-4也不是要完全替代PSR-0,而是在必要的時候補充PSR-0
        // 當然,如果你願意,PSR-4也可以替代PSR-0
        // PSR-4可以和包括PSR-0在內的其他自動載入機制共同使用
        // 
        // 
        // 這組自動載入規則,簡單說就是希望通過一組約定的目錄,檔名,類名定義方式,來實現快速通過類查詢到檔案,然後包含進來,實現自動載入
        // psr-0中,類名中的下劃線會被轉換成目錄分隔符,而psr-4則無任何意義
        "psr-4": {
            "App\\": "app/", // 表示 “app/”目錄的名稱空間為 App\
            "Models\\": "models/",// 表示 “models/”目錄的名稱空間為 Models\
            "Persimmon\\": "app/Persimmon" // 表示 “app/Persimmon/”目錄的名稱空間為 Persimmon\
        },
        // 指定檔案的載入模式,通常用於載入函式庫,即通常沒有什麼名稱空間的,程式導向式的檔案 composer dump-autoload 可重建自動載入資訊
        "files": [
            "app/Helper/function.php"
        ]
    },

    // 開發狀態下的自動載入
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/" // tests資料夾下的名稱空間為Tests
        }
    },

    // composer中的指令碼,可以是一個 PHP 回撥(定義為靜態方法),也可以是任何命令列可執行的命令。
    // 在 Composer 執行過程中,指令碼對於“執行一個資源包的自定義程式碼”或“包專用命令”是非常有用的。
    // 只有在根包中定義scripts才有用,外部依賴的composer.json中定義了scripts是不會被執行的
    "scripts": {
        // 以下key指的是 執行指令碼的事件,value是一個陣列,定義了當觸發該事件時,要執行的指令碼
        
        // 在 create-project 命令期間,根包安裝完成後觸發(注意,事件觸發於“命令期間”、“根包安裝完成後”)
        "post-root-package-install": [
            "php -r \"file_exists('.env') || copy('.env.example', '.env');\"" // 該命令會判斷.env檔案是否存在,如果不存在則把.env.example複製成.env
        ],

        // 在 create-project 命令執行後觸發
        "post-create-project-cmd": [
            "php artisan key:generate" // 專案建立完成後,根據字串“generate”生成key
        ],

        // 在 install 命令執行後觸發
        "post-install-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postInstall",
            "php artisan optimize" // 優化應用程式效能,生成自動載入檔案,且產生聚合編譯檔案 bootstrap/compiled.php
        ],

        // 在 update 命令執行後觸發
        "post-update-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "php artisan ide-helper:generate",
            "php artisan ide-helper:meta",
            "php artisan optimize"
        ]
    },

    // 專案配置
    "config": {
        // 設定 Composer 的預設安裝方法
        "preferred-install": "dist",
        "sort-packages": true
    },

    // 自定義的包資源庫
    // 預設情況下 composer 只使用 packagist 作為包的資源庫。
    // repositories 並不是遞迴呼叫的,只能在“Root包”的 composer.json 中定義,附屬包中的 composer.json 將被忽略。
    // 
    "repositories": {
        "packagist": {
            // type指資源型別
            // composer: composer 型別的資源庫
            // vcs: 從 git、svn 和 hg 取得資源。
            // pear: 從 pear 獲取資源。
            // package: 如果你依賴於一個專案,它不提供任何對 composer 的支援,你就可以使用這種型別。你基本上就只需要內聯一個 composer.json 物件
            "type": "composer",
            "url": "https://packagist.phpcomposer.com"
        }
    }
}

laravel 核心框架的檔案在require中被包含,一切外部依賴都放在vendor中,它們都是相對獨立的元件,核心框架也是一個獨立的元件。

vendor目錄下的元件會依賴於根目錄下的部分資料夾

本文出自半醒的狐狸部落格

相關文章