作曲家需要本地包装


106

我有几个正在共同开发的库[Foo和Bar],但从技术上讲它们仍然是分开的。以前,我只是将autoloader重新定义为like "Foo\\": "../Foo/src",但是现在我已经向Foo添加了Guzzle依赖项,Bar翻转了它的盖子,因为它不是其依赖项之一。

目录结构:

/home/user/src/
    Foo/
        src/
            FooClient.php
        composer.json
    Bar/
        src/
            BarClient.php
        composer.json

理论上的自动加载声明:[在Bar / composer.json中]

"require": {
    "local": "../Foo/composer.json"
}

示例代码:

require('vendor/autoload.php');

$f = new \Bar\BarClient(new \Foo\FooClient());

如何在不设置本地Composer存储库的情况下解决此问题?我想将它们作为独立的软件包进行维护,只是一个软件包需要另一个软件包,并因此处理另一个软件包的依赖关系。

答案后编辑:

感谢infomaniac,我完成了以下工作:

初始化git repo:

cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"

添加了作曲家配置:

"require": {
    "sammitch/foo": "dev-master"
},
"repositories": [{
    "type": "vcs",
    "url": "/home/sammitch/src/Foo"
}],

然后composer update


这个json如何在对“ sammitch / foo”的引用和“ / home / sammitch / src / Foo”的地址之间指定身份?是否遵循任何约定?
塞巴斯蒂安·格里戈诺利

@SebastiánGrignoli sammitch/foo是程序包名称,实际上与它所在的位置无关。将根据其配置的存储库构造可用软件包的列表,在这种情况下,将从指定的本地git存储库中获取composer.json,然后由composer处理其余内容。该sammitch/foo软件包vendor将与其他任何软件包一样复制到当前应用程序的文件夹中。
萨米奇'16

哦,我想我明白了。就像APT中一样,这只是一个自定义存储库,可能恰好包含“ sammit / foo”包。我说对了吗?
塞巴斯蒂安·格里戈诺利

@SebastiánGrignoli你
打赌

Answers:


38

您可以使用Composer的存储库功能

https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository

在磁盘上指定文件路径,而不是使用http格式。



11
getcomposer.org/doc/05-repositories.md#path也可能有用,并且对我来说似乎更好。
茉莉·黑格曼

@JasmineHegman确实!我用太-伟大的发展
丹尼Kopping

要使其成为一个很好的答案,您应该演示如何做到这一点,而不仅仅是命名功能并链接文档(尽管这也很重要)。以下其他答案有适当的示例。
rudolfbyker

173

该方式链接到一个地方,在开发包是在您的主项目的第一个附加的composer.json一个,就像这样:

"repositories": [
    {
        "type": "path",
        "url": "/full/or/relative/path/to/development/package"
    }
]

您还需要在开发包中指定一个版本,composer.json或者我需要使用来使用该包@dev,例如:

composer require "vendorname/packagename @dev"

它应该输出:

- Installing vendor/packagename (dev-develop)
Symlinked from /full/or/relative/path/to/development/package

@dev在需要指令重要,作曲家用这个皮卡的源代码,并将其符号链接到您的新包。

这是添加到版本约束中的稳定性标记(请参见package link)。

这些使您可以进一步限制或扩展程序包的稳定性,使其超出最小稳定性 设置的范围。

最小稳定性标志是:

可用的选项(在稳定的顺序)devalphabetaRC,和stable


8
请注意,composer不允许您在composer.json所在的目录中指定路径。
MaPePeR '18 -4-12

有趣的是,MaPePeR我不知道这一点。但是,我想所有Web框架都已经通过将所有依赖项放入“供应商”文件夹来解决此问题?Yii2至少这样做。
Dhiraj Gupta

3
composer require "vendorname/packagename @dev""require":{ "vendorname/packagename": "@dev" }如果您想运行composer install,则转换为应用程序的composer.json
Sir_Faenor

2
请添加以下内容:composer config repositories.local路径/ full / or / relative / path / to / development / package作为添加存储库的正确方法
罗勒

1
是否可以告诉作曲家将其安装到生产商的供应商文件夹中,而不用创建符号链接?
BenjaminH

7

花了一些时间后,我终于了解了解决方案。也许对像我这样的人会有用,并且可以节省您一些时间,所以我决定必须在这里分享。

假设您具有以下目录结构(相对于项目根目录):

composer.json
config
config/composition-root.php
local
local/bar-project
local/bar-project/composer.json
local/bar-project/src
local/bar-project/src/Bar.php
public
public/index.php
src
src/Foo.php

在此示例中,您可能会看到该local文件夹用于公司的嵌套项目,例如bar-project。但是,如果愿意,您可以配置任何其他布局。

每个项目都必须有自己的composer.json文件,例如root composer.jsonlocal/bar-project/composer.json。那么它们的内容如下:

(根composer.json:)

{
  "name": "your-company/foo-project",
  "require": {
    "php": "^7",
    "your-company/bar-project": "@dev"
  },
  "autoload": {
    "psr-4": {
      "YourCompany\\FooProject\\": "src/"
    }
  },
  "repositories": [
    {
      "type": "path",
      "url": "local/bar-project"
    }
  ]
}

local/bar-project/composer.json:)

{
  "name": "your-company/bar-project",
  "autoload": {
    "psr-4": {
      "YourCompany\\BarProject\\": "src/"
    }
  }
}

例如,如果您希望将每个项目放在单独的兄弟目录中,如下所示:

your-company
your-company/foo-project
your-company/foo-project/composer.json
your-company/foo-project/config
your-company/foo-project/config/composition-root.php
your-company/foo-project/public
your-company/foo-project/public/index.php
your-company/foo-project/src
your-company/foo-project/src/Foo.php
your-company/bar-project
your-company/bar-project/composer.json
your-company/bar-project/src
your-company/bar-project/src/Bar.php

-那么您需要在以下repositories部分中链接到相应的目录:

  "repositories": [
    {
      "type": "path",
      "url": "../bar-project"
    }
  ]

之后,别忘了composer update(甚至rm -rf vendor && composer update -v文档所建议的那样)!在幕后,作曲家将创建一个vendor/your-company/bar-project指向local/bar-project(或../bar-project分别)指向的符号链接。

假设您public/index.php只是一个front controller,例如:

<?php
require_once __DIR__ . '/../config/composition-root.php';

那么您config/composition-root.php将是:

<?php

declare(strict_types=1);

use YourCompany\BarProject\Bar;
use YourCompany\FooProject\Foo;

require_once __DIR__ . '/../vendor/autoload.php';

$bar = new Bar();
$foo = new Foo($bar);
$foo->greet();

1
“ rm -rf供应商/公司/软件包”很重要
Alex83690 '19

@ Alex83690仅当您已经composer update使用类似代码运行时composer.json,因此您需要删除由作曲家创建的先前符号链接
Whyer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.