创建你的第一个composer包

[参考文章:http://blog.jgrossi.com/2013/creating-your-first-composer-packagist-package/]

Composer是PHP的包管理器,我们可以很方便地使用别人共享的包,当然我们也可以创建自己的包以分享给其他人使用。本文就是教你如何创建自己的第一个composer包。

文件结构

首先创建如下目录结构及文件,talking_robot为项目的根目录:

1
2
3
4
5
6
7
0 talking_robot $ tree
.
└── src
└── TalkingRobot
└── Talk.php

2 directories, 1 file

编辑Talk.php文件

1
2
3
4
5
6
7
8
9
10
<?php
namespace TalkingRobot;

class Talk
{
public static function sayHello()
{
return 'Hello Composer';
}
}

开始 Composer

composer init

现在要在项目的根目录里创建一个composer.json的文件,我们可以手动创建,也可以在根目录里通过composer init命令来根据提示创建:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
0 talking_robot $ composer init


Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [cl/talking_robot]: greatcl/talking_robot
Description []: I am a talking robot and an example of composer package.
Author [caolei <caolei@qiyi.com>, n to skip]:
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]?
Search for a package:
Would you like to define your dev dependencies (require-dev) interactively [yes]?
Search for a package:

{
"name": "greatcl/talking_robot",
"description": "I am a talking robot and an example of composer package.",
"license": "MIT",
"authors": [
{
"name": "caolei",
"email": "caolei@qiyi.com"
}
],
"minimum-stability": "dev",
"require": {}
}

Do you confirm generation [yes]?

创建完成后,根目录下就生成了composer.json文件,目录结构如下:

1
2
3
4
5
6
7
8
0 talking_robot $ tree
.
├── composer.json
└── src
└── TalkingRobot
└── Talk.php

2 directories, 2 files

添加自动加载

然后我们可以手动编辑生成的composer.json文件,添加php的版本要求和自动加载(使用PSR-0),使用TalkingRobot命名空间,加载src目录下的所有文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"name": "greatcl/talking_robot",
"description": "I am a talking robot and an example of composer package.",
"license": "MIT",
"authors": [
{
"name": "caolei",
"email": "caolei@qiyi.com"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"TalkingRobot": "src/"
}
}
}

进行测试

composer install

在根目录中使用composer install安装composer文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0 talking_robot $ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files

0 talking_robot $ tree -L 2
.
├── composer.json
├── composer.lock
├── src
│   └── TalkingRobot
│   └── Talk.php
└── vendor
├── autoload.php
└── composer

4 directories, 12 files

创建测试文件

在根目录中创建tests文件夹,在tests文件夹里创建test.php内容如下:

1
2
3
4
5
6
7
8
<?php

// Autoload files using Composer autoload
require_once __DIR__ . '/../vendor/autoload.php';

use TalkingRobot\Talk;

echo Talk::sayHello();

当前的目录结构为:

1
2
3
4
5
6
7
8
9
10
11
12
13
0 talking_robot $ tree -L 2
.
├── composer.json
├── composer.lock
├── src
│   └── TalkingRobot
├── tests
│   └── test.php
└── vendor
├── autoload.php
└── composer

5 directories, 4 files

在根目录中运行测试文件:

1
2
0 talking_robot $ php tests/test.php
Hello Composer

返回字符串Hello Composer,恭喜你,测试通过!

发布到Packagist.org

最简单的方法是使用Github。

创建Github仓库

在Github上创建一个仓库talking_robot,然后将代码推到Github仓库里。

我们先在根目录里创建.gitignore文件,把vendor目录和composer.lock文件排除git在外。

1
2
3
0 talking_robot (master) $ cat .gitignore
vendor/*
composer.lock

推送代码

1
2
3
4
5
git init
git add .
git commit -m 'First commit'
git remote add origin git@github.com:username/talking_robot.git
git push origin master

提交到Packagist

  1. 首先要在Packagist上注册账号并登录
  2. 点击顶部导航条中的Summit按钮
  3. 在输入框中输入github上的仓库地址,如:https://github.com/username/talking_robot
  4. 然后点击Check按钮
    Packagist会去检测此仓库地址的代码是否符合Composer的Package包的要求。
  5. 检测正常的话,会出现Submit按钮,再点击一下Submit按钮,我们的包就提交到Packagist上了。

使用

我们就可以在其他项目引用talking_robot这个包了,方法如下:
在需要引用的项目的composer.json文件的require段加入:

1
2
3
4
5
{
"require": {
"greatcl/talking_robot":"dev-master"
}
}

如果项目初次使用composer执行composer install进行安装,否则使用composer update进行更新。

1
2
3
4
5
6
7
8
0 use-test-packagist $ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing greatcl/talking_robot (dev-master 103b7cc)
Cloning 103b7cc721d9509d3b041487fe1d0e1c46bc8cce from cache

Writing lock file
Generating autoload files