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


106

공동으로 개발중인 라이브러리 [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!


이 json은 "sammitch / foo"에 대한 참조와 "/ home / sammitch / src / Foo"의 주소 사이의 ID를 어떻게 지정합니까? 어떤 컨벤션을 따르고 있습니까?
— Sebastián Grignoli

@ SebastiánGrignoli sammitch/foo는 패키지 이름이며 문자 그대로 위치와 관련이 없습니다. 구성된 리포지토리를 기반으로 사용 가능한 패키지 목록을 생성합니다.이 경우 지정된 로컬 git 리포지토리에서 composer.json을 가져온 다음 composer가 나머지를 처리합니다. sammitch/foo패키지는 현재 응용 프로그램의 복사됩니다 vendor폴더 다른 패키지와 같은.
— Sammitch

오, 이제 알 것 같아요. APT 에서처럼 "sammit / foo"패키지를 포함 할 수있는 사용자 지정 저장소입니다. 내가 맞았나?
— Sebastián Grignoli

SebastiánGrignoli @ 당신은 별말씀
— Sammitch

답변:


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의 명령은, 작곡가 소스 코드 픽업이 중요한 사용합니다 필요로 새 패키지에 심볼릭 링크.

버전 제약에 추가 된 안정성 플래그입니다 ( 패키지 링크 참조 ).

이를 통해 최소 안정성 설정 범위를 넘어서 패키지의 안정성을 추가로 제한하거나 확장 할 수 있습니다 .

최소 안정성 플래그는 다음과 같습니다.

(안정성을 위해) 사용 가능한 옵션은 dev, alpha, beta, RC,와 stable.


8
composer.json이있는 동일한 디렉토리에있는 경로를 composer에서 지정할 수 없습니다.
— MaPeR

흥미로운 점은 MaPeR 저는 이것을 몰랐습니다. 그러나 모든 웹 프레임 워크가 모든 종속성을 "공급 업체"폴더에 저장하여 이미 처리하고 있다고 생각합니다. 적어도 Yii2는 이것을합니다.
— Dhiraj Gupta 2018

3
composer require "vendorname/packagename @dev"로 변환 "require":{ "vendorname/packagename": "@dev" }당신은 작곡가 설치 실행하려는 경우 앱의 composer.json에
— Sir_Faenor

2
다음을 추가하십시오 : composer config repositories.local path / full / or / relative / path / to / development / package as correct way of
— basil

1
composer에게 symlink를 만드는 대신 prod를 위해 공급 업체 폴더에 설치하도록 지시 할 수 있습니까?
— 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파일 이 있어야 합니다 (예 : 루트 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.