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.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();

1
"rm -rf 공급 업체 / 회사 / 패키지"가 중요합니다
Alex83690

@ Alex83690은 이미 composer update유사한 것으로 실행 한 경우에만 composer.json작성기에서 생성 한 이전 심볼릭 링크를 제거해야합니다
whyer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.