创建你的第一个Composer/Packagist包
2017/02/28 | PHP,开源社区 | chenjie| 6 条评论 | 16645 views
今天我们要介绍一下如何通过Composer和Packagist向PHP社区贡献代码包。首先,如果你是一个PHP开发者但是还不知道什么是Composer,请先参考了一下这篇文章http://docs.phpcomposer.com/00-intro.html,因为访问海外镜像源的速度较慢,也许你还需要这些方法https://pkg.phpcomposer.com/ 来获取更多基础信息。
使用Composer
Composer是PHP的一个包依赖管理工具。你可以使用第三方库也可以自行开发。现在我要告诉你如何创建一个Composer包并且发送到Packagist(其他开发者可以通过它在他们项目中使用这些发布到Packagist上的包)。
创建包
你可以创建一个新项目来使用Composer。我们建一个输出hello world 的类 。这是一个简单的类但是你也可以创建复杂的项目来分享给其他开发者。Composer通常以“vendor/package” (厂商/包名)的方式来命名。这里我们为项目命名”chenjie/hello”。
文件结构
你可以把所有的文件都放在根目录下,但是我特别推荐新建另一个文件夹 “src” 以更容易理解和维护你的代码结构。项目结构如下:
1 2 3 4 5 | hello $ tree . └── src └── SayHello.php 1 directories, 1 file |
编辑hello (项目根目录) /src/SayHello.php 文件:
1 2 3 4 5 6 7 8 9 10 11 | <?php
namespace Hello;
class SayHello { public static function world() { return 'Hello World!'; } } |
开始Composer
现在要在项目的根目录里创建一个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 | hello $ composer init Welcome to the Composer config generator This command will guide you through creating your composer.json config. Package name (<vendor>/<name>) [cl/hello]: chenjie/hello Description []: an example of composer package. Author [chenjie <chenjie@chenjie.info>, 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": "chenjie/hello", "description": "echo hello world"", "license": "MIT", "authors": [ { "name": "chenjie", "email": "chenjie@chenjie.info" } ], "minimum-stability": "dev", "require": {} } Do you confirm generation [yes]? |
根目录下就生成了composer.json
文件,目录结构如下:
1 2 3 4 5 6 | hello $ tree . ├── composer.json └── src └── SayHello.php 1 directories, 2 files |
添加自动加载
然后我们可以手动编辑生成的composer.json
文件,添加php的版本要求和自动加载(使用PSR-4),使用Hello命名空间,加载src
目录下的所有文件,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "name": "chenjie/hello", "description": "echo hello world", "license": "MIT License", "authors": [ { "name": "chenjie", "email": "chenjie@chenjie.info" } ], "minimum-stability": "dev", "require": {}, "autoload": { "psr-4": { "Hello\\": "src/" } } } |
进行测试
下面我们来简单测试下我们的类是否工作正常。我们在项目根目录执行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | hello $ composer install Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Writing lock file Generating autoload files hello $ tree -L 2 . ├── composer.json ├── composer.lock ├── src │ └── SayHello.php └── vendor ├── autoload.php └── composer 3 directories, 12 files |
创建测试文件
下面我们在根目录下新建一个测试文件test.php
1 2 3 4 | <?php require_once __DIR__ . '/vendor/autoload.php'; use Hello\SayHello; echo SayHello::world(); |
在项目根目录下执行命令 php test.php
如果终端打印出“Hello World!”那祝贺你测试通过!
发布到Packagist.org
上面我们在本地完成了编写和测试。那么想让更多人使用我们的包就需要把我们新建的包发送到Packagist.org。首先我们可以先将项目发布到Github。我们先去Github 创建一个公有仓库命名“hello”, 我们在项目根目录使用Git命令来完成发布。
我们先在根目录里创建.gitignore文件,把vendor目录和composer.lock文件排除git在外。
1 2 3 | hello (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/hello.git git push origin master |
当然我们也可以带上tag标签推送
1 2 | git tag 1.0 -a git push --tags |
提交到Packagist
- 首先要在Packagist上注册账号并登录
- 点击顶部导航条中的Summit按钮
- 在输入框中输入github上的仓库地址,如:https://github.com/chenjiesuper/ansible-php
- 然后点击Check按钮
Packagist会去检测此仓库地址的代码是否符合Composer的Package包的要求 - 检测正常的话,会出现Submit按钮,再点击一下Submit按钮,我们的包就提交到Packagist上了
- 以后更新代码可以先从Packagist获取token然后去github 配置下对应的GitHub Service Hook实现代码提交后Packagist自动拉取更新
使用
我们就可以在其他项目引用chenjie这个包了,方法如下:
在新建的项目根目录执行命令 composer require chenjie/hello
或者在新建项目根目录新建composer.json编辑:
1 2 3 4 5 | { "require": { "chenjie/hello":"dev-master" //这里的版本根据实际需要修改 } } |
然后执行 composer install 即可。
到这里我们的第一个Composer/Packagist包就完成了,但是你可以透过它做更多。谢谢!
参考
http://blog.jgrossi.com/2013/creating-your-first-composer-packagist-package/
http://qianlei.cc/create-your-first-composer-package/