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


106

У мене є декілька бібліотек [Foo і 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());

Як я можу це вирішити без встановлення місцевого репортажу композитора? Я хочу підтримувати їх як окремі пакети, просто для того, щоб один вимагав іншого, і для цього обробляти залежності інших.

редагування після відповіді:

Завдяки 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- назва пакету і не має нічого спільного з тим, де він знаходиться. Побудує список доступних пакетів на основі налаштованих репостів, у цьому випадку витягуючи composer.json з вказаного локального git repo, а потім композитор обробляє решту. sammitch/fooПакет копіюються в поточному додатку vendorпапки так само , як будь-який інший пакет.
Саммітч

О, я думаю, я зараз зрозумію. Це просто спеціальне репо, як, наприклад, в APT, яке може статися, що містить пакет "sammit / foo". Я правильно зрозумів?
Себастьян Гріньолі

@ SebastiánGrignoli ви
betcha

Відповіді:


38

Ви можете скористатися функцією сховищ композитора

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

Замість використання формату http вкажіть шлях до файлу на диску.



11
getcomposer.org/doc/05-repositories.md#path також може бути корисним і, здається, працює для мене краще.
Жасмін Гегман

@JasmineHegman дійсно! Я теж це використав - чудово для розвитку
Денні Копінг

Щоб зробити це гарною відповіддю, вам слід показати, як це зробити, а не просто називати функцію та посилати на документи (хоча це теж важливо). Інші відповіді нижче мають належні приклади.
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в вимозі важлива, композитор використовує це для підбору вихідного коду та символічного посилання на ваш новий пакет.

Це прапор стабільності, доданий до обмеження версії (див. Посилання на пакет ).

Вони дозволяють додатково обмежити або розширити стабільність пакету поза рамками встановлення мінімальної стабільності .

Прапорами мінімальної стійкості є:

Можливі варіанти (в порядку стійкості) є dev, alpha, beta, RCі stable.


8
Зауважте, що композитор не має права вказувати шлях, який знаходиться в тій самій директорії, що розміщується composer.json.
MaPePeR

Цікавий момент, MaPePeR Я цього не знав. Однак, я думаю, всі веб-рамки вже опікуються цим, вкладаючи всі залежності в папку "постачальника"? Yii2 робить це, принаймні.
Дхірадж Гупта

3
composer require "vendorname/packagename @dev"перекладається на "require":{ "vendorname/packagename": "@dev" }додаток composer.json у вашому додатку, якщо ви хочете запустити встановлення композитора
Sir_Faenor

2
Будь ласка, додайте це: композитор конфігурації repositories.local шлях / повний / або / відносний / шлях / до / розвитку / пакунок як правильний спосіб додавання сховищ
базилік

1
Чи можна сказати композитору встановити його в папку постачальників для prod замість створення символьної посилання?
БенджамінH

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.jsonта local/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

@ Alex83690, лише якщо ви вже працювали composer updateз подібними composer.jsonі тому вам потрібно видалити попереднє символьне посилання, створене композитором
Whyer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.