piwi / composer-symlinker
一个将包作为本地符号链接安装的Composer插件
Requires
- composer-plugin-api: 1.*
Requires (Dev)
- composer/composer: 1.*
This package is not auto-updated.
Last update: 2024-09-19 05:30:16 UTC
README
这是一个Composer插件,可以将包作为本地符号链接安装。
此插件是使用符号链接将本地包作为依赖项的临时实现,以便进行并行工作过程。关于(有注释的)问题的描述,请参阅composer/composer#1299。
用法
要使用它,只需将其添加到您的composer.json
中的依赖项
"piwi/composer-symlinker": "dev-master"
您必须将相关的本地路径或包定义为extra配置条目
local-dirs
:在搜索包的本地版本时扫描的本地路径列表;最终的包路径将使用vendor/package
完成;local-packages
:一个包含vendor/package => local_path
项的数组;local-vendors
:要限制本地扫描的供应商列表。
"extra": { "local-dirs": [ "/my/absolute/local/path1", "/my/absolute/local/path2" ], "local-vendors": [ "vendor1", "vendor2" ], "local-packages": { "vendor/package1": "/my/absolute/path/to/vendor/package1", "vendor/package2": "/my/absolute/path/to/vendor/package2" } }
Windows用户警告
该插件使用PHP内部的symlink()
函数。有关Windows的限制,请参阅手册。
快速教程
假设我们想要在一个名为MyProject
的项目上工作,基于三个依赖项:MyPackage1
和MyPackage2
(它们是我们的一些包),以及一个第三方ExternalPackage
(它不是)。假设我们的本地主机架构如下
[DOCUMENT_ROOT]
|
|projects/
|-------- MyVendor/
|----------------- MyPackage1/ // this is a clone of MyVendor/MyPackage1
|
|MyPackage2/ // this is a clone of MyVendor/MyPackage2
|
|MyProject/ // this is the project we currently work on
// which depends on other three packages
注意:MyVendor/MyPackage1
和MyVendor\MyPackage2
必须在某个Composer仓库中已存在,才能被Composer认为是安装或符号链接的对象。通常,包将通过Packagist可访问。但如果它们仅是本地(没有已配置的仓库),则需要在您的composer.json中添加一个本地的一个。它可能看起来像这样
"repositories": [
{
"type":"vcs",
"url":"/path/to/DOCUMENT_ROOT/projects/MyVendor/MyPackage1"
}
]
由于我们既要工作于MyProject又要工作于其依赖项MyPackageX,我们通常会首先使用Composer安装依赖项(作为硬拷贝),以便创建一个有效的autoload.php
,然后我们会手动将这些硬拷贝替换为我们的MyPackage1
和MyPackage2
的克隆的本地符号链接...
该插件可以为我们完成这项工作,只要我们很好地配置它,并强制Composer在安装依赖项时使用它。
强制Composer在安装依赖项时使用该插件的一种常见方式是将它包含在其require
语句中。在我们的情况下,这并不相关,因为我们只想用它来构建我们的本地环境(它不应该是其他用户的必需品)。一个好的方法是为我们的项目创建一个“仅开发”的Composer配置文件,这样我们就可以在我们的环境中使用插件安装本地依赖项,但让最终用户有“真实”的行为(默认行为)。
我们的“仅开发”composer.json
可能如下所示
"require": { "piwi/composer-symlinker": "1.*" }, "require-dev": { "MyVendor/MyPackage1": "dev-master", "MyVendor/MyPackage2": "dev-master", "OtherVendor/ExternalPackage": "dev-master" }, "extra": { "local-dirs": "/path/to/DOCUMENT_ROOT/projects/", "local-packages": { "MyVendor/MyPackage2": "/path/to/DOCUMENT_ROOT/MyPackage2" } }
这样,我们首先可以运行
$ composer install --no-dev
来安装插件,然后
$ composer update
将使用它来安装所有包。
我们的最终vendor
目录应该是这样的
[vendor]
|
|MyVendor/
|--------- MyPackage1 => /path/to/DOCUMENT_ROOT/projects/MyVendor/MyPackage1 (symlink)
|--------- MyPackage2 => /path/to/DOCUMENT_ROOT/MyPackage2 (symlink)
|
|OtherVendor/
|----------- ExternalPackage/ (hard copy)
并且我们的自动加载器仍然有效。