Composer需要本地包

时间:2015-05-01 19:50:34

标签: php composer-php

我有一些图书馆[Foo and Bar]我在演唱会上发展,但在技术上仍然是分开的。以前我只是将自动加载器重新定义为"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仓库的情况下解决此问题?我想将它们作为单独的包维护,只需要另一个包,然后处理其他依赖包。

回答后编辑:

感谢信徒,我做了以下事情:

初始化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

2 个答案:

答案 0 :(得分:129)

链接到本地​​开发中软件包的方法是先在主项目中添加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

require命令中的@dev很重要,作曲家使用它来获取源代码并将其符号链接到新包。

它是一个添加到版本约束的稳定性标志(参见package link)。

  

这些允许您进一步限制或扩展   超出minimum-stability范围的包的稳定性   设置。

最小稳定性标志是:

  

可用选项(按稳定顺序排列)包括devalphabetaRCstable

答案 1 :(得分:0)

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

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

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文件,例如根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设为the docs suggest)! 在幕后,作曲家将创建一个指向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();