人人为我,我为人人!向社区发布自己的 Composer 包

PHP项目,大多遇到过以下问题

  • 找到了一个类,需要把这个类引入项目,放在哪个目录?
  • 怎么autoload?
  • 它有没有依赖什么扩展?
  • 它会不会需要使用比现在更高版本的PHP上?

如果被戳中,请抽一点时间,服下Composer 这味解药 Composer详细介绍

Composer可以轻松管理这些相互依赖的包,Composer的出现无疑是为了让所有的从事PHP开发的程序猿劲往一处使,增加复用,实现像搭乐高积木一样编程,不必重复发明轮子,能够将开发社区塑造得更加生态化。
本人就经常使用composer命令为Laravel项目添加各种扩展,非常方便!

人人为我,我为人人!
同理,自己写的代码一样可以贡献给社区,这样别人就可以方便地通过 Composer 使用你的包,本教程介绍一下发布自己包的具体步骤:

首先,Packagist 官网是Composer包的资源库,所有已经发布的包都能在其中查找到,我们即将发布的包也会提交到上面, Packagist 获取到元数据信息后,具体代码会从包源代码所在的 GitHub 上拉取,因此需要准备:

  1. 创建github.com帐号
  2. 创建github.com工程
  3. 创建packagist.org帐号

此处假定GitHub工程已经初始化完成,新手GitHub相关知识自行补足 GitHub详细介绍

准备就绪,进入项目目录(本教程发布的是一款云打印机的SDK)

1、初始化项目,生成Composer包描述文件

本例代码,目录结构:
file
将类文件放在src目录下
初始化一个Composer包描述文件composer.json,在工程根目录执行命令:

composer init

会出现如下向导提示:


Package name (/) [kelaocai/yprint]: baocai/yprint
Description []: Elind Printer SDK
Author [kelaocai , n to skip]: 
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []: sdk
License []: MIT

重要的几个填写项:

  • Package name(重要):包名,一般是公司名+"/"+包名 比如 baocai/yprint
  • Minimum Stability:通常默认填写dev,因为第一次代码Push完,是在dev-master分支上,dev也就是最小稳定版本标识号
  • Package Type:根据库类别填写,sdk,lib,都可以
  • License:版权,默认填写 MIT
    接下来填写自身库需要的依赖,默认填no,后续可以在composer.json中补充修改
    
    Would you like to define your dependencies (require) interactively [yes]? no
    Would you like to define your dev dependencies (require-dev) interactively [yes]? no
    

一路回车,工程目录中已经生成好composer.json
在composer.json中增加自动加载配置,这里主要是对命名空间和本地代码目录之间的映射
类命名空间 为 BaoCai\Yprint,对应配置:


"autoload": {
    "psr-4": {
      "BaoCai\\": "src/"
    }
  }

完整的配置文件:


{
  "name": "baocai/yprint",
  "description": "Elind Printer SDK",
  "type": "sdk",
  "license": "MIT",
  "authors": [
    {
      "name": "kelaocai",
      "email": "kelaocai@163.com"
    }
  ],
  "minimum-stability": "dev",
  "require": {},
  "autoload": {
    "psr-4": {
      "BaoCai\\Yprint\\": "src/"
    }
  }
}

2、提交GitHub工程

将第一步中生成的项目文件,提交到GitHub

git add .
git commit -m 'composer init'
git push

确认提交成功后进行下一步

3、向Packagist提交包

访问Pakcagist官网,登录后,点击右上角Submit按钮,进入发布向导
file
此处填写GitHub工程地址
file
GitHub地址:注意是https开头的访问链接
file
如果找到,会提示 The package name found for your repository is: baocai/yprint, press Submit to confirm.
点击Submit提交按钮创建
一切顺利,可以看到发布成功页
file

4、设置GitHub代码自动同步

一旦在Pakagist上发布了包,之后的版本更新和代码同步,有一个机制来保证,就是GitHub中的事件通知服务,用于代码递交时触发一个事件,将代码同步到其他环境中。
file
添加服务,服务列表中选择 Packagist,进入向导
主要填写两项Packagist配置信息:

  • 用户名: 注意是Packagist上的用户名
  • Token: 通讯令牌
  • Domain: 可不用填写

其中 Token需要到Packagist的个人设置里面去获取 跳转查看
file

填写完毕,提交后,记得测试一次,完成首次同步,
file
如果成功会提示以下信息:

Okay, the test payload is on its way.

回到Packagist,刷新,应该没有再出现 (Not Auto-Updated) 的提示,说明同步机制已经生效,之后每次GitHub变化,会自动通知并同步。

5、验证包安装

以上步骤完成,就可以验证一下包是否能从库中查询到,并且验证是否能够安装
!特别注意,因为刚提交,还没有设置版本,此时版本默认是dev-master,如果直接require包名,会提示找不到对应版本,这里如果不知道,会很坑,务必加上版本指定,这里是:dev-master

composer require baocai/yprint dev-master

  • Installing baocai/yprint (dev-master 729feee) Cloning 729feee5d4 from cache

看到成功安装提示,顺利完成发布!

6、设置版本

版本默认是dev-master,Composer包的版本号会从Git的tag中同步过来,因此先设置项目代码的tag,回到项目目录

git tag 1.0.0
git push --tag

刷新Pakagist项目页,已经同步好版本:
file
再次安装验证,已经可以不用显式指定版本号,自动安装最新版本

composer require baocai/yprint

如果用composer命令的库指向的是国内全量镜像,需要稍等一下服务器同步,刚开始,可能会报找不到安装包的错误,如果一切正常,会看到版本提示,安装成功!

composer require baocai/yprint
Using version ^1.0 for baocai/yprint

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 7年前 加精
老财
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 14
老财

最近学习Composer发布包,趟了些小坑,总结了一下,希望对新手有帮助,如有错误,请指正

7年前 评论
Summer

我一直想写的文章,终于被财哥写了 :smile:

7年前 评论
老财

@Summer 你补充吧,还有很多我不知道的细节 :relaxed:

7年前 评论
Ryan

我很早前写过一篇 博客:Laravel Composer Package 开发简明教程,不过看了这篇刚好温习一下

7年前 评论
lijinma

谢谢老财,很详细,受用。

7年前 评论

dev-master坑过一整天

7年前 评论

我去安装了一下你的扩展包, 发现自动加载不好用, 问下应该怎么解决

7年前 评论

@BaiLian

conposer.json 需要改下吧


  "autoload": {
    "psr-4": {
      "BaoCai\\Yprint\\": "src/"
    }
  }
7年前 评论
老财

@BaiLian 是的,谢谢,原文已经修改

7年前 评论

好详细,感谢分享

7年前 评论
Junting

感谢分享

7年前 评论

:wave:

7年前 评论

@老财 想写一个 composer 包 Xxx/test,想实现当安装这个包时(composer require Xxx/test) 在项目根目录中创建文件,可以怎么去实现呢

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!