php開發者與composer的不得不說故事

来源:http://www.cnblogs.com/yangjiyue/archive/2017/11/19/7862069.html
-Advertisement-
Play Games

Composer是一個非常流行的PHP包依賴管理工具,已經取代PEAR包管理器,對於PHP開發者來說掌握Composer是必須的. 對於使用者來說Composer非常的簡單,通過簡單的一條命令將需要的代碼包下載到vendor目錄下,然後開發者就可以引入包並使用了.其中的關鍵在於你項目定義的compo ...


Composer是一個非常流行的PHP包依賴管理工具,已經取代PEAR包管理器,對於PHP開發者來說掌握Composer是必須的.

對於使用者來說Composer非常的簡單,通過簡單的一條命令將需要的代碼包下載到vendor目錄下,然後開發者就可以引入包並使用了.
其中的關鍵在於你項目定義的composer.json,可以定義項目需要依賴的包(可能有多個),而依賴的包可能又依賴其他的包(這就是組件的好處),這些都不用你煩心,Composer會自動下載你需要的一切,一切在於composer.json的定義.

Composer對於使用者來說是很透明,但是其背後的理念還是需要瞭解一下的,其的誕生也不是偶然的,得益於Github的快速發展,PHP語言也越來越現代化,顯得更高大上了.

為了理解Composer,先大概瞭解下其結構:

Composer的結構

  • Composer命令行工具:
    這個理解就比較簡單了,通過使用者定義的Composer.json去下載你需要的代碼,假如只是簡單的使用Composer,那麼掌握一些具體命令就完全可以了
  • Autoloading代碼載入器:
    通過Composer,開發者可以通過多種方式去使用,而其中的關鍵在於PHP的命名空間概念,以及PSR-4標準的發展,Composer只是根據這二者開發了一個代碼自動載入器
  • Github:
    有了Github,PHP開發人員可以將開源的代碼托管在這上面,而Composer的發展源於Github,Composer本質上就是將Github上的代碼下載到本地.
  • Packagist:
    對於使用者來說使用的是Composer的命令行工具,那麼命令行工具怎麼知道有多少包可以被用戶使用呢,這主要就是依賴於Packagist,Packagist是Composer主要的一個包信息存儲庫,包開發者將具體代碼托管到Github上,將包信息提交到Packagist上,這樣使用者就可以通過Composer去使用.
    Composer根據本地定義的composer.json信息去查詢Packagist,Packagist根據Composer.json/Package.json信息解析,最終對應到github倉庫,Composer最終下載代碼的時候還要依賴於Github倉庫上的Composer.json,這裡涉及到三種類型的composer.json,含義是不一樣的.
  • Composer.json:
    這是Composer的核心,是Composer的規則,上面也提到了三種類型的Composer.json,在使用的時候一定要註意區分,我初學的時候就總是搞亂.

Composer命令行工具

composer init
使用者可以在自己的項目下創建composer.json以便定義你項目的依賴包,也可以通過composer init互動式的創建composer.json.

composer install
應該是最常用的命令,composer會根據本地的composer.json安裝包,將下載的包放入項目下的vendor目錄下,同時將安裝時候的包版本信息放入到composer.lock,以便鎖定版本.
其實在install的時候,假如發現composer.lock版本和目前vendor目錄下的代碼版本是一致的,則Composer會什麼也不做,composer.lock的目的就是讓你安心在目前這個版本下工作,而不獲取最新版本的包.

composer update
那麼如何更新composer.lock以便獲取到最新版本的包呢?通過這個命令即可更新最新版本的包

composer config
這個命令還是建議瞭解下,全局的配置保存在COMPOSER_HOME/config.json,非全局的配置信息則存儲在本項目目錄下.

   
1 2 3 composer config --list -g composer config -g notify-on-install false composer global config bin-dir --absolute

composer create-project
這個命令不常用,但是個人覺得還是很重要的,使用普通的install命令是將項目所有的依賴包下載到本項目vendor目錄下.而通過這個命令則是將所有的代碼及其依賴的包放到一個目錄下,相當於執行了一個git clone命令,一般是包的開發者可能為了修複bug會使用該命令.

composer global
這是一個全局的安裝命令,它允許你在COMPOSER_HOME目錄下執行Composer的命令,比如install,update.當然你的COMPOSER_HOME要在$PATH環境下.

比如執行composer global require fabpot/php-cs-fixer,現在php-cs-fixer命令行可以全局運行了,如果稍後想更新它,只需要運行composer global update

composer dump-autoload
當你修改項目下的composer.json的文件,並不一定要運行composer update命令進行更新,有的時候可以使用該命令來更新載入器,比如你要引用本地自定義的包(不是來自於packagist),後面會通過實踐來說明該命令.

composer require
假如手動或者互動式創建composer.json文件,可以直接使用該命令來安裝包

   
1 2 composerrequire  cerdic/css-tidy:1.5.2 composerrequire"ywdblog/phpcomposer:dev-master"

–prefer-source和–prefer-dist參數
–prefer-dist:對於穩定的包來說,一般Composer安裝預設使用該參數,這也能加快安裝,比如有可能直接從packagist安裝了相應的包,而不用實際去Github上下載包.
–prefer-source:假如使用該參數,則會直接從Github上安裝,安裝包後vendor目錄下還含有.git信息

   
1 2 composer require "ywdblog/phpcomposer:dev-master" --prefer-source #在vendor/ywdblog/phpcomposer目錄下含有.git信息

如何給Composer添加代理
在國內使用Composer下載特別慢,可以通過二個方法進行加速

  • composer config repo.packagist composer “https://packagist.phpcomposer.com“
  • 編輯composer.json
       
    1 2 3 4 5 6 "repositories":{   "packagist":{       "type":"composer",       "url":"https://packagist.phpcomposer.com"   } }

    Autoloading代碼載入器

    composer本身集成一個autoloader,支持PSR-4,PSR-0,classmap,files autoloading.

    這裡通過一個例子來說明通過Composer如何引用classmap,files,本地符合PSR-4標準的代碼

    • 編輯composer.json
         
      1 2 3 4 5 "autoload": {   "classmap": ["othsrc/","classsrc.php"],   "files": ["othsrc/filesrc.php"],   "psr-4": {"Foo\Bar\": "src"} }
    • composer dump-autoload

    通過上述的操作,對於PSR-4來說等同註冊了一個PSR-4 autoloader(從FooBar命名空間)
    假如不想使用Composer的autoloader,可以直接包含vendor/composer/autoload_*.php文件,配置自己的載入器.
    具體的例子托管在github上,可參考.

    Repositories

    關於Repositories,瞭解其不是必須的,但是假如掌握則更能理解Composer,對於Repositories,其中文英文解釋的很好,這裡也進行了一些摘抄.

    基本概念
    包:
    Composer是一個依賴管理工具,它在本地安裝一些資源包和包的描述(比如包名稱和對應的版本),比較重要的元數據描述是distsource,dist指向一個存檔,該存檔是對一個資源包的某個版本的數據進行的打包.source指向一個開發中的源,這通常是一個源代碼倉庫(比如git)

    資源庫:
    一個資源庫是一個包的來源.它是一個packages/versions的列表.
    Composer將查看所有你定義的repositories以找到項目需要的資源包(這句話很重要).
    預設情況下已經將Packagist.org註冊到Composer(或者理解為Packagist.org是Composer資源庫預設的倉庫類型)

    Composer資源庫類型
    Composer資源庫包括四種類型,預設的是composer類型,也就是packagist.org所使用的資源類型.
    它使用一個單一的packages.json文件,包含了所有的資源包元數據.當你將包發佈到pckagist.org上,則預設系統會創建一個packages.json,不過我沒有找到我的包對應的文件.

    VCS資源庫類型
    假如你想構建一個私有的Composer私有資源庫類型,可以使用該類型,這裡舉一個例子,比如你在自己項目的composer.json定義如下,則就可以使用對應的Github上的代碼了.

       
    1 2 3 4 5 6 7 8 9 10 11 {     "repositories":[     {         "type":"vcs",         "url":"http://www.renti51.cn"     }     ],     "require":{         "ywdblog/phpcomposer":"dev-master"     } }

    當運行composer update的時候,Comoser實際上是從Github上下載包而不是從pckagist.org上下載.

    另外假如需要使用Package資源庫類型或者PEAR資源庫類型,參考官方文檔即可,一般在composer.json中定義name、version屬性即可.

    Composer.json

    在本文上面也多次提到了composer.json,比如你希望使用第三方包則需要在本地定義composer.json,Composer安裝第三方包後,也會在第三方包目錄下發現composer.json,那麼這二者都叫composer.json,有什麼區別呢?理解這非常的重要.

    假如你在自己的項目下麵定義一個composer.json,則這個包稱之為ROOT包,這個composer.json定義你項目需要的條件(比如你的項目可能依賴一個第三方包).

    composer.json中有些屬性只能被ROOT包使用,比如config屬性只在ROOT包中生效.

    一個資源包是不是ROOT包,取決於它的上下文,比如你git clone ywdblog/phpcomposer,則這時候本地phpcomposer目錄就是ROOT包,假如你在本地phpcomposer目錄下composer require ywdblog/phpcomposer,則這時候你的項目phpcomposer就是ROOT包.

    瞭解composer-schema.json參考該網址,Laravel作為一個成熟的框架,其定義的composer.json非常經典

    關於包的版本
    當使用者在本地配置composer.json的時候,可以指定需要包的特定版本,Composer支持從Github倉庫中下載Tag或者分支下的包.

    對於Github上的Tag來說,Packagist會創建對應包的版本,它符合X.Y.Z,vX.Y.Z,X.Y.Z-包類型,就是說Github上雖然只有一個特定版本的包,但Composer支持多種形式的引用方式,比如:

       
    1 2 3 4 composer require monolog/monolog  1.0.0-RC1 composer require monolog/monolog  v1.0.0-RC1 composer require monolog/monolog  1.0.* composer require monolog/monolog  ~1.10

    對於Github上的分支來說,Packagist會創建對應包的版本,假如分支名看起來像一個版本,將創建{分支名}-dev的包版本號,如果分支名看起來不像一個版本號,它將會創建dev-{分支名}形式的版本號

       
    1 2 composerrequiremonolog/monolog  master-dev composerrequiremonolog/monolog  master.x-dev

     

    總結:

    理解Composer,最重要的是實踐,最後也能明白PSR-4和命名空間,也可以嘗試將你的項目發佈到pckagist.org上.

    來自:http://www.girl4493.cn

  •  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 發佈-訂閱消息模式 一、訂閱雜誌 我們很多人都訂過雜誌,其過程很簡單。只要告訴郵局我們所要訂的雜誌名、投遞的地址,付了錢就OK。出版社定期會將出版的雜誌交給郵局,郵局會根據訂閱的列表,將雜誌送達消費者手中。這樣我們就可以看到每一期精彩的雜誌了。 發佈-訂閱消息模式 一、訂閱雜誌 我們很多人都訂過雜誌 ...
  • 1. 學習了一下 AI 五子棋,順手改作 19 路的棋盤,便於圍棋通用。render.py 主要修改如下: 2. 發現 pygame 還不錯,便從網上搜索到《Beginning Game Development With Python And Pygame》,其中螞蟻游戲的 AI 表現甚好,主要代碼 ...
  • 前言 本篇將結合JDK1.6的TreeMap源碼,來一起探索紅-黑樹的奧秘。紅黑樹是解決二叉搜索樹的非平衡問題。 當插入(或者刪除)一個新節點時,為了使樹保持平衡,必須遵循一定的規則,這個規則就是紅-黑規則: 1) 每個節點不是紅色的就是黑色的 2) 根總是黑色的 3) 如果節點是紅色的,則它的子節 ...
  • 本文主要給大家分享使用matlab編寫代碼,完成課程設計、畢業設計或者研究項目時,matlab調試程式的技巧和方法。 快速完成一個項目,最簡單的方法就是利用前人的開源代碼,然後根據自己項目的具體需求和參數,對已有代碼進行調試,並增加或刪減部分功能,最終實現自己項目的全部功能。所謂“站在前人的肩膀上... ...
  • Joinpoint 連接點 Pointcut 切入點 Advice 通知/增強 舉例: Aspact 切麵 比如給add()增加日誌功能的過程即稱為切麵 還有幾個術語知道就可以,不常用 Introduction (引入)使用動態的方法在原有屬性基礎上 添加新屬性的操作 ...
  • 前言: 之前寫Java服務端處理POST請求時遇到了請求體轉換成字元流所用編碼來源的疑惑,在doPost方法里通過request.getReader()獲取的BufferedReader對象內部的 Reader用的是什麼編碼將位元組流轉換成字元流的呢?又是在哪裡設置呢和什麼時候生效的呢?通過查找資料, ...
  • 作者:NiceCui 本文謝絕轉載,如需轉載需徵得作者本人同意,謝謝。 本文鏈接:http://www.cnblogs.com/NiceCui/p/7862377.html 郵箱:[email protected] 日期:2017-11-19 Python學習二:詞典基礎詳解 (學習不要求多,小計劃 ...
  • 流程式控制制 與C語言不通的是python的流程式控制制代碼塊不是用{}花括弧表示的,而是強制縮進來控制的;而且縮進必須一致,官方推薦是使用4個空格,不建議使用tab(製表符)做縮進,一是不同的系統tab所占寬度不一致,會比較亂,二是由於python要求同級縮進必須保持一致,所以有些時候看上去是對齊l,但是 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...