如何自己创建网页创建一个自己的 Composer/Packagist 包

用于 PHP 依赖关系处理的 Composer
此内容是该系列 # 部分中的第 # 部分: 更新后的 PHP/developerworks/cn/views/global/libraryview.jsp?series_title_by=更新后的+php敬请期待该系列的后续内容。此内容是该系列的一部分:更新后的 PHP敬请期待该系列的后续内容。
由于 PHP 已经成熟,使用它建立的应用程序的复杂性在急剧增长。现代 PHP
开发人员往往依靠第三方库来帮助自己更快地构建软件项目。例如,如果不使用现在为 PHP 提供的维护良好的第三方库,那么有可能无法构建像
这种规模的应用程序。但是,软件重用的好处是有代价的:您不仅必须管理每个应用程序安装所需的库的列表,还必须管理所创建的依赖关系树,因为所使用的库均构建于其他库之上。您如何能够管理多个库的复杂且相互依赖的安排?
开发人员在过去常用的两种依赖关系处理解决方案已失去其效率。其中一个解决方案是将自己所需的所有库与自己的代码一起签入到版本控制存储库中。这种技术在某程度上是可行的,但所造成的麻烦往往比它解决的问题更大。您需要维护自己的本地库版本。您必须通过下载新的版本,并将其签入存储库,从而手动执行任何可用的库错误修复。最终,版本控制中会有一个巨大的变更日志,它与实际代码完全无关。由于这些原因,库一般会逗留在开始时刚好签入的那个版本,很少被更新。 PHP Extension and Application Repository (PEAR) 项目的部分设计目的是帮助您解决这个问题。PEAR
提供了一组配合工作的库,程序员可以为该库做出贡献。PEAR 还包括命令行工具,用于安装所需的库及其依赖关系(如果有的话)。PEAR
在很长一段时间中曾是最好的办法,并且有很多人使用它,但这个系统也有其不足之处。 PEAR
库安装被全局存储在操作系统上。虽然这种设计可以避免将库签入到您自己的版本控制存储库中,但它导致的问题比它解决的问题还要多。永远不知道在自己可能使用的任何系统上到底在运行哪个库版本。这种混乱往往成为虚假错误的来源:您会在新服务器上安装自己的应用程序,然后感到困扰,为什么它不工作,最终您可能认识到,原因是有问题的服务器没有合适的
PEAR 库。您需要访问权限来安装这些全局库(这是很多人在共享托管方面都觉得棘手的一个问题)。“大家都知道,与第一步编写程序相比,调试的难度要高得多。
所以,如果在编写时尽可能聪明一些,又怎么会需要调试呢?”Brian Kernighan 2011 年 4 月,两位 PHP 开发人员(Nils Adermann 和 Jordi Boggiano)认为 PHP
的依赖关系处理问题需要有一个新的解决方案,并开始进行开发。他们在 2012 年 3 月 1 日发布了 。在 Composer
中,您可以创建一个配置文件,指定应用程序所需的第三方库(无论它们被托管在哪里)。然后运行 Composer,编写
完整的应用程序:Composer 下载您指定所有的库及其所有依赖关系。本文将介绍 Composer 的基础知识,演示如何开始在 PHP
项目中使用该工具。安装 ComposerComposer 是一个多平台工具。在任何基于 UNIX® 或 Linux® 的计算机上,安装 Composer
都很简单。您可以通过 curl 和 PHP 直接运行安装程序,创建一个本地安装: curl -sS https://getcomposer.org/installer | php 上面的命令在本地 composer.phar 可执行文件中创建一个 Composer 安装。为了系统上的任何地方都能全局访问这个安装,请将
composer.phar 复制到您的路径的一个目录中,如本例所示(您可能需要使用 sudo 给自己赋予根目录的写权限): mv composer.phar /usr/local/bin/composer 现在,您可以在系统上任何位置从命令行运行 composer。 在 Windows®上,手动安装比较困难,所以 Composer 创建者开发了一个 ,您可以下载并运行它。在完成安装后,您可以从 Windows 命令行使用 Composer。基本用法 Composer 是一个功能强大的工具,提供了数量惊人的选项。但是,最常见的用法是,根据第三方提供的配置,为第三方 PHP
应用程序或框架创建/下载/安装一个代码库。例如,可以
Zend 框架及其所有依赖关系。运行 Composer 的 install 命令,Composer
就会完成余下的工作。如果全局安装了 Composer(或安装在 Windows 上),请运行以下命令: composer install 如果只对一个应用程序完成了本地 Composer 安装,则运行: php composer.phar install 在本文的其余部分,我的示例假设您已全局安装了 Composer。 除了下载项目/应用程序所需的所有库之外,Composer 还提供了一个方法,让您可以轻松地包括所有的库。它将所有的库安装到一个命名为 vendor
的文件夹,将它们与您自己的项目代码区分开来。在 vendor 文件夹中,它创建了一个名为 autoload.php
的文件。在您的项目中包括该文件,这等于为 Composer 所下载的所有库都安装了一个自动加载程序: require 'vendor/autoload.php';Composer 如何查找库 要下载库包,Composer 首先需要知道在哪里可以找到这些软件包。信息由 Composer 存储库 提供:在线来源列出了
Internet 上提供的软件包、如何检索它们,以及它们自己的依赖关系。虽然任何人都可以维护自己的存储库,以提供对内部库的访问权限(Composer
网站为此提供了 ),但您会使用的主要存储库是 。Packagist 提供为 PHP 中的大部分开源项目提供软件包。您可以去那里找到自己需要的库。 软件库往往不是良好的合作对象。将所有 Packagist 库结合在一起的粘合剂是由
(原名 PHP
Standards Group)提供的,该组织是在
上成立的。成立 PHP-FIG(代表着众多流行的 PHP
应用程序和框架的一组人)就是为了看看人们的项目如何能够更好地协同工作。该合作的高潮是 PHP Standards Recommendations
(PSR) 的创建,它描述库的可选标准。实现这些共同标准的库能够在一组共同的期望下互操作。 最重要的 PSR 是
和 ,它们促进了 Composer
的创建。这些 PSR
为类和命名空间声明一个共同的命名方法,以及它们应该如何将文件映射到文件系统上。然后,一个共同的自动加载程序接口可以从它需要的任何库加载类。创建一个通用的标准方式,让库不需要覆盖彼此就可以共享它们的类,这使得
Composer 变得非常有效。为自己的项目配置 Composer 现在,您已经知道了如何安装 Composer,了解了自动装载的工作原理,并且能够找到自己想要使用的软件包,我将介绍一个为自己的项目设置
Composer 的示例。 我将会开始编写一个新的 PHP 项目,这是一个小程序,能够将 Markdown 文件转换为 HTML 输出。在 Packagist 搜索
markdown,显示
库作为一个不错的选择,并显示项目的
的URL,如图 1 所示: 图 1. 在 Packagist 上的库条目 为了告诉 Composer 在您的项目中要包括哪些文件,创建一个名为 composer.json 的配置文件。这个 JSON
格式的文件可以包含各种命令,但您需要的最常用的(而且往往是惟一的)命令是 require
键。我将自己想要的软件包名称以及将要支持的版本传递给这个键: {
"require":{
"michelf/php-markdown":"1.4.*"
} 现在,我可以在我的应用程序目录中运行 composer install。 Composer
需要几分钟来下载我所指定的库要求到一个 vendor 目录中,并为我创建一个包括此目录的自动加载程序。Composer 也创建了另一个文件,即
composer.lock,我会立刻更详细地介绍它。命令和输出看起来如下所示: & ls
composer.json
& composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing michelf/php-markdown (1.4.1)
Downloading:100%
Writing lock file
Generating autoload files
composer.json composer.lock vendor/ 现在我可以编写依赖于 michelf/php-markdown 软件包的代码。下面简短的 PHP 脚本将完成我想做的工作: &?php
require 'vendor/autoload.php';
use \Michelf\M
echo Markdown::defaultTransform(file_get_contents("php://stdin")); 多亏了 Composer,我获得了一个简单明了的解决方案。我选择的 Markdown
包碰巧没有额外的依赖关系。但是,如果我选择了一个有依赖关系的软件包,Composer 将在同一时间自动下载所有这些依赖关系并配置它们。指定版本 您可以根据自己的软件需求,将任意数量的库添加到 composer.json
文件,此外,对于每一个库,您都可以指定想接受的版本。指定版本是一个很重要的部分,可以确保您的软件始终可用。通过在版本号中使用通配符,甚至可以允许
Composer 以您的名义升级库。在前面的示例中,我指定的版本为 "1.4.*"。现在,每当运行
composer install 时,Composer 将查找 1.4 版库的最新版本,但不会接受 1.5、2.0
或其他任何更高版本。如果我希望总是获得库的最新版本,那么我可以指定 "*"(但如果底层 API
被更改,这可能会引起问题)。 表 1 显示,在指定版本限制时可以使用的选项的完整列表。表 1. 软件包的版本限制规范示例描述确切版本1.0.2软件包的确切版本。范围&=1.0&=1.0 &2.0&=1.0 &1.1 || &=1.2比较运算符可以指定有效版本的范围。有效的运算符是
&、&=、&、&=
和 !=。可以定义多个范围,而且默认情况下按照 AND 处理,或者用双竖线
(||) 分开它们,则作为一个 OR 运算符。连字符范围1.0 - 2.0创建一个包容性的版本集。通配符1.0.*带有 *
通配符的模式。1.0.* 相当于
&=1.0 &1.1。波浪运算符~1.2.3“下一个重要版本”:允许最后一位数字增加,因此变得和
&=1.2.3 &1.3.0 一样。允许最后一位数字增加。^运算符^1.2.3“下一个重要版本”:类似于波浪线运算符,但假设语义版本和直到下一个主要版本的所有变更都应该被允许,因此变得和
&=1.2.3 &2.0 一样。软件包稳定性 在配置 Composer
获取项目所需要的准确的库时,另一个要考虑的因素是想要的库版本有多稳定。如果需要最新的版本或正在帮助测试软件,那么可以请求软件包的测试版或开发分支。您可以指定稳定性标志,将它添加到
require 字符串的末尾,并使用 @。例如,为了请求 PHPUnit
的最新开发版本,您可以指定:{
"require":{
"phpunit/phpunit":"4.8.*@dev"
}对于引用,Packagist 显示存在哪些分支,以及引用它们需要使用的字符串,如
所示。版本锁定 使用 Composer 的巨大好处是,版本控制中不需要包括第三方库。在发布软件的新安装时,可以允许 Composer
为您下载并配置所有库,从而保持版本控制清洁。但是,您可能会遇到问题。想象一下,您的网站运行 20
个并发服务器,全部使用不同版本的库,因为代码的部署和 composer install
的运行分别在不同的时间发生。或者更简单地说,多个开发人员可能有不同的库,并且无法复制彼此的错误。其结果可能是灾难性的。 Composer 为这个问题提供了一个解决办法。回想 "" 一节,初次运行 composer install 时创建了一个
composer.lock 文件。该文件指定到底要安装哪些库,以及过程中下载哪些特定的版本。当您将项目提交到版本控制软件中的时候,请提交
composer.lock 文件,而不是 vendor 目录。当准备好一个代码的新部署,并且运行了
composer install 的时候,Composer
会首先查找一个锁定文件。如果找到该文件,则会安装一个与原始安装完全相同的副本,以确保所有安装的一致性。 当然,还需要了解迁移动到新代码版本的方式,最好是采用比删除锁定文件和整个 vendor 目录更好的方式。Composer 以
update 命令的形式提供该工具。当运行 composer update 时,Composer
会参照 JSON
文件的最新配置,比较已安装的软件版本与锁定文件。如果配置允许的较新版本的软件是可用的(或者,如果自上次安装后,新库已被添加到配置),Composer
会下载新的库,并对它们进行相应的配置。为自己的类创建一个自动加载程序 Composer 还有许多内置的功能,可以在
中阅读了解这些功能。其中一个最好的功能是,您可以在配置中指定自己的类,这使得 Composer
可以自动在自动加载程序中生成项目的代码。此功能让您免于自己创建独立于 Composer 的自动加载程序。在这里,我可以更新以前的 composer.json 文件来创建自己的自动加载程序: {
"require":{
"michelf/php-markdown":"1.4.*"
"autoload":{
"psr-4":{"Converter\\":"src/"}
} 在本例中,我指定了一个名为 Converter 的命名空间,并说明该命名空间的所有类文件均存在于名为 src
的相对目录中。所以,如果我有一个名为 Converter\CommandLine
的类,自动加载程序将会查找这个类,它在文件系统中被保存为 src / CommandLine.php。这个文件现在是为我生成的一个 PSR-4
兼容的自动加载程序。提供自己的软件包 此时,我可以将 Markdown 到 HTML 的转换器应用程序提供为一个 Packagist
上的软件包。(由于转换器是一个应用程序,而不是一个可重用的库,将它作为一个软件包提供并没有实际意义,但是,为了本练习的需要,我们假装它是一个库)。从本质上讲,通过创建我的
composer.json 文件,该应用程序本身是一个软件包,可以安装它。包名称的格式必须是
vendor/package。所以,在我的例子中,我将下面的代码添加到配置文件: "name":"EliW/Converter", 其他一些配置也值得补充。您可以将所需的 PHP 版本指定为 Composer 将执行的虚拟软件包名称。(您有许多选项,可以强制版本号,而不是让
Composer 假定标准的版本控制系统模式。您可以提供元数据,让软件包列表看起来像是完整的。)为了指定 PHP
版本号,并将我自己的转换器打包为完整的软件包,我会这样做: {
"name":"EliW/Converter",
"require":{
"michelf/php-markdown":"1.4.*",
"php":"&=5.3.0"
}配置现在是完整的。当我将自己的应用程序提交给一个在线版本控制系统(如 GitHub),我可以登录到我的 Packagist
帐户,并提交我的软件包信息,让其他人可以将我的应用程序包含在他们的项目中。结束语 在本期
文章中,我介绍了如何使用 Composer 从第三方库组装项目的基本知识。查看 ,找到有关 Composer
的不常用功能的更深入讨论,并了解如何托管自己的内部库,而无需通过 Packagist 帮助组织复杂的代码库。按照本文章系列的进展,我已经介绍了 PHP
本身的演变过程,它如何满足现代安全要求,以及它如何采用现代的依赖关系管理和软件包管理系统来处理日益复杂的现代代码库。在下期文章中,我将讨论 PHP
生态系统的发展情况,让开发人员可以通过使用 PuPHPet 来管理其部署和开发环境。
相关主题:查看 developerWorks PHP 项目资源来提升您的 PHP 技巧。 ""(Dan Denoncourt,developerWorks,2011
年 3 月):获得命名空间语法的概述,学习其用法的最佳实践,并查看使用命名空间的一个小型 Model-View-Controller
应用程序示例。 ""(Dan Denoncourt,developerWorks,2010 年 12
月):了解如何和在何处使用 PHP 闭包的更多信息。:了解如何以现代方式构建 PHP 项目的更多信息。:咨询所有 PHP 文档的官方源代码。:获得有关 PHP 的新闻、视图和社区信息。:查看致力于 PHP 教育的在线杂志、印刷杂志和最近新闻。 :通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax
的新信息都能在这里找到。查看 ,了解更多和 HTML5 相关的知识和动向。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Web development, Open sourceArticleID=1008726ArticleTitle=更新后的 PHP: 用于 PHP 依赖关系处理的 Composerpublish-date=最佳实践系列(二)—— 聊聊 PHP 私有组件以及如何创建自己的 PHP 组件
这篇文章对我很有帮助
这篇文章对我很有帮助
学院君 has written
资深PHP工程师,Laravel学院院长> 如何创建一个自己的 Composer/Packagist 包
首先让我们踏着欢快的脚步去Github创建一个新库,这里取名 composer-car,又欢快的将它克隆到本地:git&clone&/shuiguang/composer-car.git
cd&composer-car这个composer-car文件夹就是你的包的root目录了,你只需要记住composer.json在包的哪个目录下面,一般那就是包的root目录了。不过github给了一些命令行建议,以后提交github项目的时候需要使用这些命令:…or&create&a&new&repository&on&the&command&line
echo&&#&composer-car&&&&&README.md
git&add&README.md
git&commit&-m&&first&commit&
git&remote&add&origin&/shuiguang/composer-car.git
git&push&-u&origin&master
…or&push&an&existing&repository&from&the&command&line
git&remote&add&origin&/shuiguang/composer-car.git
git&push&-u&origin&master
…or&import&code&from&another&repository
You&can&initialize&this&repository&with&code&from&a&Subversion,&Mercurial,&or&TFS&project.由于我们创建的是一个全新的库,还没有composer.json文件,你可以根据composer文档生成并编辑它,当然composer贴心的为我们准备了初始化命令:composer&init什么?你还没有在packagist.org上注册账号?赶紧访问https://packagist.org/,使用你的github账号授权登陆或者直接用邮箱注册一个用户名。例如我的packagist的主页地址为:https://packagist.org/users/shuiguang/packages/那么我在packagist的用户名就是shuiguang,以后发布composer包的时候就是shuiguang/xxxxOK,我们这里输入:shuiguang/composer-car回车
Description&[]:&&&(这里填包的描述,可以不填直接回车)
Author&[shuiguang&&&]:&(如果你在shell下登陆过git应该有保存你的邮箱名,直接回车即可,如果没有按照上面的格式自己补充)
Minimum&Stability&[]:&(最低要求,该参数至关重要,建议填写dev可以直接将github上代码check到packagist,&master、RC等版本类型我还没尝试过)
Package&Type&[]:&(大概是填镜像信息,可不填直接回车以后编辑composer.json)
License&[]:&(授权协议,可不填直接回车)
Define&your&dependencies.
Would&you&like&to&define&your&dependencies&(require)&interactively&[yes]?&(填no直接回车)
Would&you&like&to&define&your&dev&dependencies&(require-dev)&interactively&[yes]?&(填no直接回车)
Do&you&confirm&generation&[yes]?&(填yes直接回车)
Would&you&like&the&vendor&directory&added&to&your&.gitignore&[yes]?&(填yes直接回车,事实上github上很多项目都不会提交vendor目录)由于我们在交互界面大部分都是输入no导致composer.json信息量较少,我们将其改为:{
&&&&&name&:&&shuiguang/composer-car&,
&description&:&&In&order&to&study&composer&,
&license&:&&MIT&,
&&&&&authors&:&[
&&&&&&&&&&&&&name&:&&shuiguang&,
&&&&&&&&&&&&&email&:&&***@&
&&&&&minimum-stability&:&&dev&,
&&&&&require&:&{
&&&&&&&&&php&:&&&=5.3.0&
&autoload&:&{
&&&&&&&&&psr-4&:&{
&&&&&&&&&&&&&Ford\\Escape\\&:&&src/Ford/Escape&,
&&&&&&&&&&&&&Ford\\Fusion\\&:&&src/Ford/Fusion&,
&&&&&&&&&&&&&Ford\\Focus\\&:&&src/Ford/Focus&,
&&&&&&&&&&&&&Ford\\Fiesta\\&:&&src/Ford/Fiesta&
}好了,终于生成了一份composer.json文件,如果不喜欢命令行可以保留一份以后直接改改放到别的项目就行。细心的小伙伴可能已经认出了福特的商标(Ford),这说明我们都是同道中人,你一定也很喜欢汽车,对吧对吧? :-)我们登陆一下福特的网站看看都有哪些热销车型,嗯嗯分别有ESCAPE、FUSION、FOCUS、FIESTA,中文名称分别是翼虎、蒙迪欧、福克斯、嘉年华,嘉年华ST我的梦想啊~~~ 好了好了,那位看官放下你手里的板砖,我承认一说到汽车就会滔滔不绝,下面我们把水分挤出去继续讲解。根据上面的命名空间和目录的映射关系,包的结构现在应该是下面这个样子:composer-car
-&-&-&Escape
-&-&-&-&Escape2013.php
-&-&-&Fiesta
-&-&-&-&Fiesta2013.php
-&-&-&Focus
-&-&-&-&Focus2013.php
-&-&-&Fusion
-&-&-&-&Fusion2013.php
-&.gitignore
-&composer.json
-&README.md下面给出这个四个php文件的代码内容Escape2013.php:&?php
namespace&Ford\E
class&Escape2013
&&&&public&static&function&info()
&&&&&&&&echo&&This&is&Ford&Escape2013!&br&/&&;
}Fiesta2013.php:&?php
namespace&Ford\F
class&Fiesta2013
&&&&public&static&function&info()
&&&&&&&&echo&&This&is&Ford&Fiesta2013!&br&/&&;
}Focus2013.php:&?php
namespace&Ford\F
class&Focus2013
&&&&public&static&function&info()
&&&&&&&&echo&&This&is&Ford&Focus2013!&br&/&&;
}Fusion2013.php:&?php
namespace&Ford\F
class&Fusion2013
&&&&public&static&function&info()
&&&&&&&&echo&&This&is&Ford&Fusion2013!&br&/&&;
}我在linux下快速创建目录结构,然后将这四个php文件上传到指定位置:mkdir&src
mkdir&src/Ford
mkdir&src/Ford/Escape
mkdir&src/Ford/Fiesta
mkdir&src/Ford/Focus
mkdir&src/Ford/Fusion
composer&install接下来我们通过composer install生成映射关系,之后将会在项目目录下自动生成vendor目录,并在vendor下自动生成了composer包autoload程序文件。这时,在vendor目录根本找不到我们之前上传的四个php文件,这是为什么呢?因为verndor/composer/autoload_psr4.php中记录了$vendorDir和$baseDir的路径,packagist会自动将你的项目文件放到vendor目录下:所以我们需要将composer-car项目提交到github上,好让packagist是通过github来自动完成检出操作。如果不知道怎么在github上提交项目可以看看之前创建项目时github给了一些命令行建议。我的执行命令如下:好了,现在访问你的github项目的网址,你会发现刚才增加的文件都会出现在github上,但是没有vendor目录,只有一个src/Ford目录接下来访问:https://packagist.org/packages/submit在输入框中填入你在github上的项目地址:/shuiguang/composer-car/
建议填入git项目的路径:/shuiguang/composer-car.git这时packagist可能会提示你有一些别人的项目和你的同名,直接忽略点击“Submit”按钮。稍等几秒,你在packagist上的包就发布成功啦:https://packagist.org/packages/shuiguang/composer-car这里有四个颜色的按钮对这个包进行操作:Abandon:点击这个后提示使用者自己不再维护了Delete:删除此项目Update:从git更新到packagist上Edit:修改git项目的地址如果你修改了项目的代码并push到github之后,packagist是不知道项目已经更新了,你需要点击上面那个“update”的按钮完成更新操作,但是这样很麻烦,于是github和packagist合作,允许使用Service完成自动更新,你需要到github上对这个项目进行设置——Settings里Add Service。选择左侧的Webhooks & service,然后点击右侧Add Service按钮,然后选择下拉选项中的Packagist,这时需要你输入github的密码继续操作。接着你需要填入以下3条信息,Token信息全部可以从https://packagist.org/profile/获取——Show API TokenUser填你在packagist的用户名:shuiguangToken填Show API Token之后的key:****************Domain填http://packagist.org填完提交之后,在Services下新增了Packagist的自动更新服务,但是Packagist左侧的小圆点是灰色的,并且提示This&hook&has&never&been&triggered这时你需要对github上的代码进行修改测试一下是否能够完成自动更新。我们随便给改动一下README.md文件,再次提交到github。神奇的事情发生了,在Webhooks & service的右侧Packagist的小圆圈变为绿色的钩:last&delivery&was&successful还有更强大的功能,Webhooks & service上方的Webhooks可以自定义接收网址然后github在每次更新时自动post数据到你的网站,这里就不演示了。现在我们尝试使用composer install来安装这个项目,然后在新的项目目录中新建一个这样的composer.json文件,注意此composer.json文件并非之前的那个composer.json文件。{
&&&&&require&:&{
&php&:&&&=5.3.0&,
&shuiguang/composer-car&:&&dev-master&
&&&&&repositories&:&{
&&&&&&&packagist&:&{
&&&&&&&&&&type&:&&composer&,
&&&&&&&&&&url&:&&http://packagist.org&
}然后使用命令进入到该目录下执行composer install命令。OK,一切都很顺利,成功使用composer安装了刚才发布的包。可是,你知道为什么一定要带上repositories中的packagist镜像网址吗?因为使用http://packagist.org镜像源的时候国内被墙,使用国内的镜像源会报不存在这个包,报错如下:Your&requirements&could&not&be&resolved&to&an&installable&set&of&packages.
&&Problem&1
&&&&-&The&requested&package&shuiguang/composer-car&could&not&be&found&in&any&version,&there&may&be&a&typo&in&the&package&name.
Potential&causes:
&-&A&typo&in&the&package&name
&-&The&package&is&not&available&in&a&stable-enough&version&according&to&your&minimum-stability&setting
&&&see&&/d/topic/composer-dev/_g3ASeIFlrc/discussion&&for&more&details.
Read&&https://getcomposer.org/doc/articles/troubleshooting.md&&for&further&common&problems.
[root@iZu116o2qrjZ&composer-car]#&composer&install
Loading&composer&repositories&with&package&information
Installing&dependencies&(including&require-dev)
Your&requirements&could&not&be&resolved&to&an&installable&set&of&packages.
&&Problem&1
&&&&-&The&requested&package&shuiguang/composer-car&could&not&be&found&in&any&version,&there&may&be&a&typo&in&the&package&name.
Potential&causes:
&-&A&typo&in&the&package&name
&-&The&package&is&not&available&in&a&stable-enough&version&according&to&your&minimum-stability&setting
&&&see&&/d/topic/composer-dev/_g3ASeIFlrc/discussion&&for&more&details.所以建议使用国外的服务器做测试,如果没有国外的服务器,可以等到第二天尝试一下国内的全量镜像源:一般来说,国内的镜像站不是很及时,刚发布的包不可能立刻同步,但是packagist.org官方镜像肯定是存在这个包的。接着我们在/composer-car目录下新建一个show.php,代码如下:&?php
require&__DIR__&.'/vendor/autoload.php';
use&Ford\Escape&as&E
use&Ford\Fiesta&as&F
use&Ford\Focus&as&F
use&Ford\Fusion&as&F
echo&Escape\Escape2013::info();
echo&Fiesta\Fiesta2013::info();
echo&Focus\Focus2013::info();
echo&Fusion\Fusion2013::info();然后在php命令行下执行这个show.php:OK,composer自动加载类就是这么简单。虽然运行没问题,但是建议不要提交show.php文件到github上,我们得写一个自动化测试套件之后发布到包里面,让使用者直接通过phpunit命令进行测试。如果不知道phpunit怎么用可以先去学习一下,这里不讲。在项目的根目录下首先建立一个tests的目录,然后编写bootstrap.php启动测试的文件:&?php
//&Enable&Composer&autoloader
/**&@var&\Composer\Autoload\ClassLoader&$autoloader&*/
$autoloader&=&require&dirname(__DIR__)&.&'/vendor/autoload.php';
//&Register&test&classes
$autoloader-&addPsr4('composer-car\tests\\',&__DIR__);很明显,该操作的意图是将composer-car/tests目录注册到需要autoload的目录。接着便可以在tests目录下编写我们的测试类了,其中一个测试类代码如下:Escape2013Test.php&?php
class&Escape2013Test&extends&PHPUnit_Framework_TestCase
&&&&public&function&testEcho()
&&&&&&&&$a&=&new&Ford\Escape\Escape2013();
$a-&info();
$this-&expectOutputString('This&is&Ford&Escape2013!&br&/&');
}另外三个测试类类似,我们主要测试echo缓冲区的输出。建议在项目根目录下添加一个phpunit.xml文件,配置内容如下:&?xml&version=&1.0&&encoding=&UTF-8&?&
&phpunit&bootstrap=&tests/bootstrap.php&&
&/phpunit&使用composer安装的包的tests目录和phpunit.xml并不会放到项目的根目录下,这时如果和git一起使用,我们就能直接在项目的根目录下执行phpunit tests命令直接测试了。composer有一点不是很喜欢,可能是我对composer的原理不熟的缘故,例如我在一个未安装过的composer项目的目录中直接使用composer&require&shuiguang/composer-car也不会报错,可是根本没法将我的包下载完全,总是出现下面内容:Using&version&^x.x&for&shuiguang/composer-car
Loading&composer&repositories&with&package&information
Updating&dependencies&(including&require-dev)
Nothing&to&install&or&update
Writing&lock&file
Generating&autoload&files但是如果我手动编辑composer.json之后,然后执行composer update则可以下载。我个人总结的经验是:如果你只使用了一个包,建议手动编辑composer.json文件然后执行composer update安装;如果使用了多个包,除第一个以外的包可以使用composer require安装最后,我们测试一个github发行版,给我们的项目加一个版本号v1.0:访问github的项目发行版网址:/shuiguang/composer-car/releases我们创建一个releases项目:Tag version:v1.0.0Release title:composer-car-1.0.0-stableWrite:test然后点击“Publish release”添加一个v1.0的版本。接着访问packagist,更神奇的是刚才添加的v1.0版本已经被自动检出了。然后将之前的&shuiguang/composer-car&:&&dev-master&改为&shuiguang/composer-car&:&&^1.0&这时运行composer update便可以从dev版升级到v1.0.0版本。
本文地址:转载随意,但请附上文章地址:-)

我要回帖

更多关于 如何自己创建一个rpc 的文章

 

随机推荐