Подтвердить что ты не робот

Композитор требует локальный пакет

У меня есть несколько библиотек [Foo and Bar], которые я разрабатываю в согласии, но все еще технически раздельные. Раньше я просто переопределял автозагрузчик, чтобы он понравился "Foo\\": "../Foo/src", но теперь, когда я добавил зависимость от Guzzle в Foo, 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:

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!

4b9b3361

Ответ 2

Способ подключения к локальному пакету разработки должен сначала добавить в основной проект 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 в команде require важны, композитор использует это, чтобы выбрать исходный код и связать его с вашим новым пакетом.

Это флаг стабильности, добавленный к ограничению версии (см. ссылка пакета).

Это позволяет вам дополнительно ограничить или расширить стабильность пакета выходит за рамки minimum-stabilityустановка.

Флаги минимальной стабильности:

Доступными параметрами (в порядке стабильности) являются dev, alpha, beta, RC и stable.

Ответ 3

Потратив некоторое время, я наконец понял решение. Может быть, это будет полезно для таких, как я, и сэкономит вам время, поэтому я решил, что должен поделиться этим здесь.

Предполагая, что у вас есть следующая структура каталогов (относительно корневого каталога вашего проекта):

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.json и local/bar-project/composer.json. Тогда их содержимое будет следующим:

(root 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 (или даже composer update rm -rf vendor && composer update -v как рекомендуют документы)! Под капотом composer создаст символическую ссылку 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();