#

本章将讲解如何使您的库可以通过 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(即标记版本)的包。

基本用法 | 命令行界面

发现错字?文档中存在错误?分叉并编辑