[php] Composer에는 로컬 패키지가 필요합니다.

공동으로 개발중인 라이브러리 [Foo and Bar]가 몇 개 있지만 기술적으로는 여전히 분리되어 있습니다. 이전에는 autoloader를 like로 다시 정의 "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 저장소를 설정하지 않고 어떻게 해결할 수 있습니까? 나는 이것들을 별도의 패키지로 유지하고 싶습니다. 하나는 다른 하나를 필요로하고 다른 하나의 종속성을 처리합니다.

답변 후 편집 :

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!



답변

Composer의 저장소 기능을 사용할 수 있습니다.

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

http 형식을 사용하는 대신 디스크의 파일 경로를 지정하십시오.


답변

로컬에서 개발 패키지에 링크하는 방법은 메인 프로젝트의 첫 번째 추가하는 것입니다 저장소 과 같습니다 :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.


답변

시간을 들여 마침내 해결책을 이해했습니다. 나 같은 사람에게 유용 할 수도 있고 시간을 절약 할 수있을 것이므로 여기에서 공유해야한다고 결정했습니다.

프로젝트 루트 디렉터리에 상대적인 다음 디렉터리 구조가 있다고 가정합니다.

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같은 워드 프로세서 제안 )! 내부적으로 작곡가는 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();


답변