2017-11-10 143 views
0

我試圖找到一種正確的方法來強制作曲者編譯爲 符號鏈接本地包。強制作曲者將符號鏈接本地包

我知道有一個問題How to force Composer to download a local package?但它不能回答我的問題。我需要確保它按預期工作,因爲我將在CI工作流程中使用它。

有項目的composer.json像:

{ 
    "name": "Some project", 
    "type": "project", 
    "minimum-stability": "dev", 
    "prefer-stable": true, 
    "repositories": [{ 
     "type": "path", 
     "url": "packages/*/*" 
    }] 
} 

和包裝的composer.json(包/樣本/包):

{ 
    "name": "Sample package", 
    "version": "1.0.0" 
} 

我們假設:

  • sample/package:1.0.0發表在packagist(提交aaaaaa) - 與未改性composer.json
  • sample/package本地被檢查出在提交bbbbbb
  • 我不能修改versionsample/package的本地

命令1:

$ composer require sample/package 

包是f蝕刻自packagist(版本1.0.0,提交aaaaaa)。

命令2:

$ composer require sample/package:@dev 

包從本地版本的供應商目錄符號鏈接(版本1.0.0,提交bbbbbb,符號鏈接)。

的問題是:

  1. 爲什麼命令1個下載包從packagist儘管minimum-stability選項?版本約束@dev可讓您執行不同的穩定性,但已使用項目配置將其降至dev
  2. 命令2在每種情況下創建符號鏈接到本地​​包?
  3. 有沒有比命令2更好的方法來確保本地軟件包得到符號鏈接?

回答

1

爲什麼儘管最小穩定性選項,命令1從packagist下載軟件包?版本約束@dev可以讓你執行不同的穩定性,但它已經下達到使用項目配置進行開發。

我最好的教育猜測是,當composer require sample/package沒有提供版本約束時,Composer仍然會嘗試找到穩定的版本進行安裝,因爲"prefer-stable": true。當您將此選項設置爲false(或明確提供@dev版本的包的版本約束)時,您應該使用最新的可用版本(提交bbbbbb上的dev-master)看到Composer。

在任何情況下,命令2是否會爲本地包創建符號鏈接?

不是在任何情況下。您可以使用"symlink": true選項強制Composer始終使用符號鏈接包。

https://getcomposer.org/doc/05-repositories.md#path

本地包將如果可能被符號鏈接,在這種情況下,在控制檯中的輸出將來自../../packages/my-package讀取符號鏈接。如果符號鏈接不可行,則將複製軟件包。在這種情況下,控制檯將輸出從../../packages/my-package鏡像。

而不是默認的回退策略,您可以強制使用符號鏈接"symlink": true或鏡像與"symlink": false選項。從單一存儲庫部署或生成包時,強制鏡像可能很有用。

有沒有比命令2更好的方式來確保本地軟件包得到符號鏈接?

您應該避免從composer.json中刪除"prefer-stable": true,因爲這會影響所有依賴關係。

我建議只確保您明確要求@dev版本爲sample/package並且爲本地存儲庫設置"symlink": true。這會導致類似於:

{ 
    "name": "Some project", 
    "type": "project", 
    "minimum-stability": "dev", 
    "prefer-stable": true, 
    "repositories": [{ 
     "type": "path", 
     "url": "packages/*/*", 
     "symlink": true 
    }], 
    "require": { 
     "sample/package": "@dev" 
    } 

}