hometownticketing / composer-shared-package-plugin
此composer插件允许您通过符号链接在您的项目之间共享选定的包。
Requires
- php: >=7.3.0
- composer-plugin-api: >=1.1.0
Requires (Dev)
- composer/composer: >=1.9
- phpunit/phpunit: ^9.3
README
此composer插件允许您通过创建符号链接在您的项目之间共享您选定的包。
所有共享的包都将位于您所有项目中的同一个专用目录中(按版本排序),并在您的项目上创建一个符号链接目录容器(默认为vendor-shared
)。
此插件将改进您的工作流程,以避免在vendor
文件夹中工作或避免强制您将包推送到其他项目以进行工作/测试。
- 工作原理
- 安装
- 结构生成示例
- 如何使用(已知问题)
- 仅更新您自己的包
- 在开发环境中禁用此插件(例如,用于CI目的)
- 与Satis一起工作:提高Composer速度
- 所有可用配置
- 报告问题或功能请求
- 变更日志
- 致谢
- 许可证
工作原理
共享包可以通过两种方式标记
- 通过设置根项目
composer.json
的额外配置package-list
,包含所选包的名称(仅适用于>= 2.x
版本)。 - 通过将
composer.json
包的类型设置为shared-package
(<= 1.x
版本的方法,仍然适用于2.x
)。
如果根项目composer.json
中需要此composer插件:包将被下载到您提供的专用依赖目录,并在项目vendor-shared
目录中创建符号链接(默认)。
此插件允许您通过创建以您包的版本命名的子目录(如dev-master、dev-develop、1.0.x-dev等)同时处理一个包的多个版本。
在依赖源目录中创建一个packages.json
文件,以了解哪些项目使用了包的版本,并能够在Composer卸载过程中询问您是否要删除版本目录,如果没有项目似乎在使用它。
安装
步骤 1:编辑您的根composer.json
将以下require(仅在开发中使用)添加到您的根项目composer.json
中
// composer.json (project) { "require-dev": { "letudiant/composer-shared-package-plugin": "~2.0" } }
注意:此插件在生产模式下运行良好,但它是为开发目的创建的。
步骤 2:设置您的依赖项供应商路径
您的依赖项供应商路径是所有共享包将被下载的路径。此路径应位于所有项目相同的级别(或更高)。
如果您的工作环境不处理符号链接,您可以使用此目录来处理您的开发包。否则,您将能够直接在现代IDE(如PHP Storm、SublimeText等)中使用符号链接。
将以下额外配置添加到您的根项目composer.json
中
// composer.json { "extra": { "shared-package": { "vendor-dir": "/path/to/your/dependencies/directory" } } }
注意:您可以通过相对路径(如foo/bar
)或绝对路径(以“/”开头:如/foo/bar
)传递路径。
如果您的路径是相对的,则符号链接目录的基本路径也将是相对的。
对于虚拟机用户的通知:如果您的宿主机依赖项目录路径与虚拟机不同,您可以通过配置symlink-base-path
手动覆盖符号链接目录的基本路径,有关更多信息,请参阅所有可用配置页面。
步骤 3:选择您的共享包
在您的自己的包中添加 composer.json
,指定您想要在项目间共享的包。
// composer.json { "extra": { "shared-package": { "vendor-dir": "/path/to/your/dependencies/directory", "package-list": [ "foo/bar", "bar/*" ] } } }
注意:如您所见,您可以在包名称中传递通配符 *
。因此,在这个例子中,所有以 bar/
开头的包都将被共享。注意²:您可以设置包名称为 *
以共享 所有包。
步骤 4:安装(重新)依赖项
如果您已经安装了项目依赖项,您必须完全删除您的 vendor/
目录和您的 composer.lock
文件。
运行 composer install
命令。
您应该会看到一个包含所有共享包符号链接的新 vendor-shared
文件夹。
步骤 5:使用 require-dev
您可以通过将 require
依赖项设置为稳定版本(~x.x.x
)并在开发环境中使用正在进行的版本来避免在两个项目 composer.json
中存在两个项目,通过在 require-dev
中设置您的开发版本,如下所示:
// composer.json (project) { "require": { "acme/foo-bar": "~1.0" }, "require-dev": { "acme/foo-bar": "dev-develop as 1.0" } }
因此,您将能够在开发环境中使用开发版本,并在生产中使用稳定版本。
注意:别名 * as 1.0
可能会避免 Composer 版本解析错误,因为默认情况下没有处理这种行为。
注意²:Composer 并非为与开发版本/分支一起使用而创建,因此当您运行 composer install
时,当前包分支的 HEAD
提交将标记在您的 composer.lock
中。
因此,下次您在开发环境中运行此命令时,如果您已经有一个 composer.lock
文件,Composer 将检查标记的提交而不是分支的新 HEAD
(如果您已提交新更改): 您的共享包将不会是最新的。为了避免这种行为,请参阅 "如何使用 - 仅更新您的自己的包"。
结构生成示例
这里有一个完整的例子。我们的共享包名为 acme/foo-bar
。
// composer.json (project) { "require": { "letudiant/composer-shared-package-plugin": "~1.0", "symfony/console": "~2.6", "acme/foo-bar": "~1.0" }, "require-dev": { "acme/foo-bar": "dev-develop as 1.0" }, "extra": { "shared-package": { "vendor-dir": "../composer-dependencies", "package-list": [ "acme/foo-bar" ] } } }
使用此 composer.json
,结构将如下所示:
|-- packages.json |-- composer-dependencies/ | +-- acme/ | +-- foo-bar/ | +-- dev-develop/ | |-- src/ | |-- composer.json | +-- ... +-- project/ +-- src/ +-- vendor/ | +-- symfony/ | +-- console/ | +-- ... |-- vendor-shared/ | +-- acme/ | +-- foo-bar/ (symlink to "../../../composer-dependencies/acme/foo-bar/dev-develop/") +-- ...
如何使用(和已知问题)
此插件实现了一个由 Composer 未处理的新行为,因此有一些已知问题。以下是解决这些问题的方法。
所有可用配置
请参阅 所有可用配置文档。
报告问题或功能请求
请随时在 问题跟踪器 中提出问题、分支此项目或提出一个出色的功能建议。
变更日志
3.1.0
3.0.0 :
- 使用
getInstallPath
方法修复 Composer 中的 BC 更新。
2.0.0 :
- 通过配置
package-list
实现选择要共享的每个包的可能性 - 更多信息。 - 删除对稳定/开发版本的约束。现在共享包也将以稳定版本(标记)共享。
1.2.0 :
- 重写安装程序,安装程序选择过程现在在一个专门的类中。
- 实现新的
symlink-enabled
配置,允许启用/禁用符号链接创建过程 - 更多信息。
1.1.0 :
- 实现新的
symlink-base-path
配置,如 philbates35 所建议,允许 VM 用户覆盖符号链接目录的基本路径,请参阅 问题 - 更多信息。
致谢
此插件项目由 L'Etudiant 维护。
Composer项目由Nils Adermann和Jordi Boggiano维护,更多信息请参见https://github.com/composer/composer#authors。
许可证
此插件采用MIT许可协议,更多信息请参见LICENSE文件。
您还可以阅读Composer许可协议以获取更多信息。