本文为你介绍composer.json中的各项。

name *

包名,它包括供应商名称和项目名称,使用 / 分开,比如下面的样子。

abei2017/yii2-emoji

这个主要起到一个命名空间的作用,比如一个项目可以需要 abei2017/yii2-emoji 和 abei2017/yii2-cool-sms ,那么在vendor里可以将yii2-emoji和yii2-cool-sms都放到abei2017文件夹下。

另外这样做可以避免重复,比如开发者abei2017和开发者anan2017多做了库yii2-ext这个扩展,因为有命名空间的限制,所以不不会冲突。

description *

一个包的简短描述。通常这个最长只有一行。比如看下面yii2的一个description。

{
    "name": "yiisoft/yii2-app-basic",
    "description": "Yii 2 Basic Project Template"
}

version

版本,不是必须的,并且建议忽略。所以这里也不在进行说明,毕竟我们都是放到github上,给composer提交的时候它会自己分析。

type *

包的安装类型,默认为 library。你可以设定一个自定义的类型。这可以是一个 wordpress-plugin等。这些类型都将是具体到某一个项目,而对应的项目将要提供一种能够安装该类型包的安装程序。

比如我们开发的yii2扩展,它的类型就是 yii2-extension,而yii2程序提供了一个逻辑进行该包的处理。

vendor/yiisoft/yii2-composer/Installer.php

当然composer原生支持以下4种类型:

  • library: 这是默认类型,它会简单的将文件复制到 vendor 目录。
  • project: 这表示当前包是一个项目,而不是一个库。
  • metapackage: 当一个空的包,包含依赖并且需要触发依赖的安装,这将不会对系统写入额外的文件。因此这种安装类型并不需要一个 dist 或 source。
  • composer-plugin: 一个安装类型为 composer-plugin 的包,它有一个自定义安装类型,可以为其它包提供一个 installler。

仅在你需要一个自定义的安装逻辑时才使用它。建议忽略这个属性,采用默认的 library。

keywords

该包相关的关键词的数组。这些可用于搜索和过滤。

homepage

该项目网站的 URL 地址。

time

版本发布时间。必须符合 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS 格式。

license

协议,这个还是写上吧,最近因为版权除了很多事,比如某某大公司把开发者的代码申请了专利云云。

  • Apache-2.0
  • BSD-2-Clause
  • BSD-3-Clause
  • BSD-4-Clause
  • GPL-2.0
  • GPL-2.0+
  • GPL-3.0
  • GPL-3.0+
  • LGPL-2.1
  • LGPL-2.1+
  • LGPL-3.0
  • LGPL-3.0+
  • MIT

对于闭源软件,你必须使用 "proprietary" 协议标识符。

license的一些写法如下

"license": "MIT" // abei2017/yii2-emoji
"license": "BSD-3-Clause",// yii2
"license": ["LGPL-2.1","GPL-3.0+"]
"license": "(LGPL-2.1 or GPL-3.0+)"
"license": "(CC-BY-4.0 and MIT)",   // emojione/emojione

使用一个扩展时候一定先看看它的协议

authors

选填,建议填写,是一个数组形式,如下图

"authors": [
    {
        "name": "Qiang Xue",
        "email": "qiang.xue@gmail.com",
        "homepage": "http://www.yiiframework.com/",
        "role": "Founder and project lead"
    },
    {
        "name": "Alexander Makarov",
        "email": "sam@rmcreative.ru",
        "homepage": "http://rmcreative.ru/",
        "role": "Core framework development"
    }
],

这个对象包含以下属性:

  1. name: 作者的姓名,通常使用真名。
  2. email: 作者的 email 地址。
  3. homepage: 作者主页的 URL 地址。
  4. role: 该作者在此项目中担任的角色(例:开发人员 或 翻译)。

support

一些支持,比如有个论坛、有个聊天时等等,看下面代码

"support": {
    "issues": "https://github.com/yiisoft/yii2/issues?state=open",
    "forum": "http://www.yiiframework.com/forum/",
    "wiki": "http://www.yiiframework.com/wiki/",
    "irc": "irc://irc.freenode.net/yii",
    "source": "https://github.com/yiisoft/yii2"
}

这个对象包含以下属性:

  1. email: 项目支持 email 地址。
  2. issues: 跟踪问题的 URL 地址。
  3. forum: 论坛地址。
  4. wiki: Wiki 地址。
  5. irc: IRC 聊天频道地址,类似于 irc://server/channel。
  6. source: 网址浏览或下载源。

require*

必须的软件包列表,除非这些依赖被满足,否则不会完成安装。这个是很重要的,比如你按照yii2-emoji,它的require是下面的样子。

"require": {
    "yiisoft/yii2": "*",
    "emojione/emojione": "^3.1"
}

则必须还要安装yiisoft/yii2和emojione/emojione,如果系统中以及存在则不用再安装。

require-dev (root-only)

这个列表是为开发或测试等目的,额外列出的依赖。可以使用 --no-dev 参数来跳过 require-dev 字段中列出的包。

autoload

PHP autoloader 的自动加载映射。存在vendor/composer里的一些文件的一些映射关系。

PSR4(vendor/composer/autoload_psr4.php),看如下代码

"autoload": {
    "psr-4": {
        "abei2017\\emoji\\": "src"
    }
}

那么这个设置代表了什么那?

use abei2017\emoji\Emoji
// 程序回去src文件夹找Emoji.php文件

PSR0(vendor/composer/autoload_namespaces.php)

一个重要的区别:PSR0里面最后一个\之后的类名中,如果有下划线,则会转换成路径分隔符,如Name_Space_Test会转换成Name\Space\Test.php。在PSR4中下划线不存在实际意义

Classmap(vendor/composer/autoload_classmap.php)这个 map 是经过扫描指定目录(同样支持直接精确到文件)。

你可以用 classmap 生成支持支持自定义加载的不遵循 PSR-0/4 规范的类库。要配置它指向需要的目录,以便能够准确搜索到类文件。

//phpunit
"autoload": {
    "classmap": [
        "src/"
    ]
},

Files

如果你想要明确的指定,在每次请求时都要载入某些文件,那么你可以使用 'files' autoloading。通常作为函数库的载入方式(而非类库)。

{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}

include-path

不建议:这是目前唯一支持传统项目的做法,所有新的代码都建议使用自动加载。 这是一个过时的做法,但 Composer 将仍然保留这个功能。

{
    "include-path": ["lib/"]
}

minimum-stability

这定义了通过稳定性过滤包的默认行为。默认为 stable(稳定)。因此如果你依赖于一个 dev(开发)包,你应该明确的进行定义。

可用的稳定性标识(按字母排序):dev、alpha、beta、RC、stable。

repositories

使用自定义的包资源库。

默认情况下 composer 只使用 packagist 作为包的资源库。通过指定资源库,你可以从其他地方获取资源包。

Repositories 并不是递归调用的,只能在“Root包”的 composer.json 中定义。附属包中的 composer.json 将被忽略。

archive

这些选项在创建包存档时使用。

exclude: 允许设置一个需要被排除的路径的列表。使用与 .gitignore 文件相同的语法。一个前导的(!)将会使其变成白名单而无视之前相同目录的排除设定。前导斜杠只会在项目的相对路径的开头匹配。星号为通配符。

{
    "archive": {
        "exclude": ["/foo/bar", "baz", "/*.test", "!/foo/bar/baz"]
    }
}