库#
本章将讲解如何使您的库可以通过 Composer 安装。
每个项目都是一个包#
只要您在某个目录中拥有一个 composer.json
文件,该目录就是一个包。当您向项目添加 require
时,您实际上是在创建一个依赖于其他包的包。您的项目与库的唯一区别是,您的项目是一个没有名称的包。
为了使该包可安装,您需要为它提供一个名称。您可以通过在 composer.json
文件中添加 name
属性来实现。
{
"name": "acme/hello-world",
"require": {
"monolog/monolog": "1.0.*"
}
}
在本例中,项目名称为 acme/hello-world
,其中 acme
为供应商名称。提供供应商名称是必需的。
注意:如果您不知道使用什么供应商名称,您的 GitHub 用户名通常是一个不错的选择。包名称必须是小写,并且约定使用短横线来分隔单词。
库版本控制#
在大多数情况下,您将使用某种版本控制系统(如 git、svn、hg 或 fossil)来维护您的库。在这些情况下,Composer 会从您的 VCS 推断出版本,因此您不应在 composer.json
文件中指定版本。(有关 Composer 如何使用 VCS 分支和标签来解决版本约束的信息,请参阅版本文章。)
如果您是手动维护包(即,没有使用 VCS),您需要通过在 composer.json
文件中添加 version
值来显式指定版本。
{
"version": "1.0.0"
}
注意:当您向 VCS 添加硬编码版本时,该版本将与标签名称冲突。Composer 将无法确定版本号。
VCS 版本控制#
Composer 使用您 VCS 的分支和标签功能来解决您在 require
字段中指定的版本约束,以匹配特定文件集。在确定有效的可用版本时,Composer 会查看您所有的标签和分支,并将它们的名称转换为内部选项列表,然后将其与您提供的版本约束进行匹配。
有关 Composer 如何处理标签和分支以及如何解决包版本约束的更多信息,请阅读版本文章。
锁定文件#
对于您的库,您可以提交 composer.lock
文件。这可以帮助您的团队始终针对相同的依赖项版本进行测试。但是,此锁定文件不会对依赖于它的其他项目产生任何影响。它只对主项目产生影响。
如果您不想提交锁定文件,并且使用的是 git,请将其添加到 .gitignore
中。
发布到 VCS#
一旦您拥有包含 composer.json
文件的 VCS 存储库(版本控制系统,例如 git),您的库就已经可以使用 Composer 安装了。在本例中,我们将 acme/hello-world
库发布到 GitHub 的 github.com/username/hello-world
下。
现在,要测试安装 acme/hello-world
包,我们在本地创建一个新项目。我们将其命名为 acme/blog
。此博客将依赖于 acme/hello-world
,而 acme/hello-world
又依赖于 monolog/monolog
。我们可以通过在某个地方创建一个新的 blog
目录,其中包含一个 composer.json
文件来实现这一点。
{
"name": "acme/blog",
"require": {
"acme/hello-world": "dev-master"
}
}
在本例中不需要名称,因为我们不想将博客发布为库。添加此名称是为了明确说明要描述的是哪个 composer.json
文件。
现在,我们需要告诉博客应用程序在哪里可以找到 hello-world
依赖项。我们通过向博客的 composer.json
文件添加一个包存储库规范来实现这一点。
{
"name": "acme/blog",
"repositories": [
{
"type": "vcs",
"url": "https://github.com/username/hello-world"
}
],
"require": {
"acme/hello-world": "dev-master"
}
}
有关包存储库的工作原理以及其他可用类型的更多详细信息,请参阅存储库。
就是这样。您现在可以通过运行 Composer 的 install
命令来安装依赖项!
回顾:任何包含 composer.json
文件的 git/svn/hg/fossil 存储库都可以通过指定包存储库并在 require
字段中声明依赖项来添加到您的项目中。
发布到 packagist#
好的,现在您可以发布包了。但是,每次都指定 VCS 存储库很麻烦。您不希望强迫所有用户都这样做。
您可能注意到的另一件事是,我们没有为 monolog/monolog
指定包存储库。这是怎么做到的呢?答案是 Packagist。
Packagist 是 Composer 的主要包存储库,默认情况下已启用。任何发布到 Packagist 的内容都可以通过 Composer 自动获得。由于 Monolog 位于 Packagist 上,因此我们可以依赖它,而无需指定任何其他存储库。
如果我们想与世界分享 hello-world
,我们也会将其发布到 Packagist 上。
您访问 Packagist 并点击“提交”按钮。这会提示您注册(如果您还没有注册),然后允许您提交 VCS 存储库的 URL,Packagist 会开始抓取该 URL。完成后,您的包将可供所有人使用!
轻量级发行包#
一些无用的信息,如 .github
目录,或大型示例、测试数据等,通常不应包含在发行包中。
.gitattributes
文件是 git 特定文件,类似于 .gitignore
文件,也位于您的库的根目录。如果存在并且由 git 跟踪,它会覆盖本地和全局配置(分别为 .git/config
和 ~/.gitconfig
)。
使用 .gitattributes
来防止不必要的文件使 zip 发行包变得臃肿。
// .gitattributes
/demo export-ignore
phpunit.xml.dist export-ignore
/.github/ export-ignore
通过手动检查生成的 zip 文件来进行测试。
git archive branchName --format zip -o file.zip
注意:这些文件仍然会被 git 跟踪,只是不会包含在 zip 发行包中。这仅适用于从 GitHub、GitLab 或 Bitbucket 安装的来自 dist(即标记版本)的包。
发现错字?文档中存在错误?分叉并编辑!