我正在寻找用PHP开发一个包,但我不希望它立即在GitHub或某个地方提供。在我的composer.json
中包含Packagist文件很容易,但如何在我的composer.json
中添加本地包?另外,我应该在/vendor/foo/bar
(相对于根composer.json
)构建包,还是应该将其放在其他地方?
编辑:我想我的问题是关于其他人如何编写他们的软件包。是否每个新包都添加到Packagist中,然后当您想要测试更改时,您提交GitHub(或任何地方),然后通过Composer将其拉回来?这似乎效率很低。
答案 0 :(得分:24)
由于这个问题有许多不同的组成部分/标准需要解释,我会尽量在这里解释一下,你可以告诉我或者谷歌它可以提出更具体的问题。
要回答您的第一个问题,“如何在我的composer.json
中添加本地包?”:
如果通过“添加本地包”意味着自动加载您的类/包,则可以通过在composer中使用PSR-4或PSR-0或Classmap选项来实现。
如果您需要有关PSR-0,PSR-4和Classmap的更多信息,可以谷歌。
"autoload": {
"psr-4": { "Core\\": "src/Core" } ## "standard": { "namespace" : "path/to/dir"}
}
如果您确实想要添加本地包:
为本地包创建composer.json
,例如:
{
"name": "localPackage/core",
"version": "dev-master"
}
您还可以根据需要指定其他属性和/或依赖项。
压缩包裹,将composer.json
文件作为archive.zip
中的根文件,并将其放在所需的位置。
在要包含本地包的其他项目/包中,将本地包名称添加到所需参数,例如
"localPackage/core": "dev-master"
在repositories
参数下添加以下内容:
"repositories" : [
{
"type": "artifact",
"url": "path/to/localPackage.zip"
}
]
现在如果你在git上有本地包,那么就不需要存档包(基本上省略了第2步),你只需要将上面例子中的URL替换为path/to/localPackage/.git
。 / p>
(编辑结束)
现在回答更大的问题:“我如何开发和包含Composer包?”:
确定目录结构。通常如下:
/PackageRoot
/src/PackageCore
composer.json ## this is your library’s composer.json
LICENSE
并设置composer.json
。
我可以在http://pastebin.com/tyHT01Xg找到我的一个composer.json
文件示例。
将其上传到Github和tag the version。使用Semantic versioning(确保在上传到Github时排除/忽略vendor
目录。
使用Packagist注册包(登录后)。
如果您已将提交标记为v1.0.0
(或类似),则此信息将显示在您的Packagist信息中心中。
现在,如果一切正常,您应该能够将您的库作为其他项目的依赖项,将其添加到该项目的composer.json
。
答案 1 :(得分:18)
您可以告诉编写者使用任何本地路径,而不是创建新的存储库:
https://getcomposer.org/doc/05-repositories.md#path
例如,假设您在~/devel/projects
您可以将您的主项目放在~/devel/projects/main_project
,以及您的"本地包"在~/devel/projects/local_package
定义本地包的composer配置。在~/devel/projects/local_package/composer.json
。
{
"name": "your_vendor_id/your_local_package",
...
}
然后,您可以修改~/devel/projects/main_project/composer.json
并通过路径仓库链接到您的本地包:
"repositories": [
{
"type": "path",
"url": "../local_package",
"options": {
"symlink": true
}
}
],
"require": {
"your_vendor_id/your_local_package": "dev-master",
...
}
此链接的更多信息(不是我写的,但对此主题有很好的解释):
答案 2 :(得分:9)
似乎这个帖子上的大多数答案都不是“知情”。我自己是Composer的新手,但这些答案都是误导性的。问题可以简单地说:“我如何开发作曲家包”。
是的,您可以使用自定义存储库或上传未完成的包,并在每次更改后更新它。这既不是正确的解决方案,也不是问题的答案。
Composer's official documentation未提前说明这一点没有帮助,但您可以在Libraries documentation page上看到标题:
每个项目都是一个包
理解这一点非常重要
前面提到的页面继续说明:
为了使该软件包可安装,您需要为其命名。您可以通过在
中添加name属性来执行此操作composer.json
{ "name": "acme/hello-world", "require": { "monolog/monolog": "1.0.*" } }
到目前为止,在这个例子中,我们有一个必需的包,现在是一个名字。请注意 vendor/name
格式。
现在要自动加载我们自己的文件,这些文件记录在Basic usage页面上。
{ "autoload": { "psr-4": {"Acme\\": "src/"} } }
这将自动加载src/Acme
目录下的命名空间类文件。
开心了。
使用以下命令安装或更新软件包:
composer update
或
php composer.phar update
这将下载所需的包并创建autoload.php文件
我们的项目结构应与以下内容类似:
src
Acme
Foo.php
vendor
monolog
...
composer.json
现在进行测试。
包括autoload.php
require_once 'path/to/project/vendor/autoload.php';
假设Foo.php如下所示:
<?php
namespace Acme;
class Foo {
public static function bar(){
return 'baz';
}
}
?>
然后我们可以从我们的脚本中调用它:
echo Acme\Foo::bar(); // baz
请更正我可能声明的任何误导性信息。这似乎是一个流行问题的解决方案。
答案 3 :(得分:7)
这里是解决方案和我自己的
的概述由于您还没有想要发布,您还处于开发阶段,这是一个不好的选择。
您可能不希望在github上发布您的图书馆资源,不想支付私人资源,或者能够使用云外部服务(由于政治或网络政策)。
您可以使用示例实现中的composer存储库路径指向本地zip文件作为发行版。每次对lib进行更改时都必须重新压缩,即使使用批处理文件也是如此,这很icky。
这已经接近了,但是每次更改库并且想要测试示例实现时,您都需要更新作曲家。这模仿制作,但很麻烦。我个人推荐这个解决方案,即使它没有脑子。
这是一个黑客,但你可以添加:
{
"require": {
},
"autoload": {
"psr-4": {
"yourlibnamespace": "D:\\Code\\yourlib\\src\\"
}
}
}
请注意,您需要复制+粘贴&#39;要求&#39;从lib到示例实现的部分。更改&#39; yourlibnamespace&#39;到您的库名称空间和&#34; D:\ Code \ yourlib \ src \&#34;到您的图书馆来源的本地路径。
这样可以立即反映任何变化。但是,您根本不会使用或测试库的composer.json文件。如果您更改了库中的要求.json它根本不会流过。所以它有一些很大的缺点,但它确实做你想要的,即用最少的命令立即测试你的库实现。
通常你只有src \和tests \,但是很多都有例子\你可以在哪里找到样例实现。在开发应用程序时,您可以为这些示例实现做出贡献。您可以在本地git / svn repo中执行此操作,并且您可以自动获取lib&#39; require&#39;以及命名空间。这是世界上最好的。我推荐这种方法。
答案 4 :(得分:5)
也许添加自定义存储库会对您有所帮助吗?
https://github.com/composer/composer/blob/master/doc/05-repositories.md
您可以非常轻松地在您的库中设置本地git存储库。
当然,如果您使用composer来管理依赖项,您应该在其他地方构建您的库并将其下载到vendor / via composer coz这是我猜的全部观点。
答案 5 :(得分:5)
为了提高开发效率,我只需将开发存储库符号链接到已经安装它的目录中。
例如,如果/Code/project-1
需要/Code/package-1
中的包,我:
package-1
提交给GitHub(甚至可以是私有的)。 project-1
使用自定义存储库安装它(请参阅存储库配置链接的其他答案)。 /Code/project-1/vendor/developer/package-1
符号链接到/Code/package-1
。 这样,当我在/Code/package-1
中进行更改时,它会立即反映在/Code/project-1
中。
答案 6 :(得分:5)
这是我在本地创建和开发新的Composer包的过程:
这仍然不理想,但它可以完成中小型包装的工作。
答案 7 :(得分:0)
我的工作流程并未完全回答OP的问题,但可能对其他人有所帮助。
所以我的工作很简单:我直接在供应商目录下添加软件包,或直接或使用符号链接。