program story

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

inputbox 2020. 9. 24. 07:49
반응형

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

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

These allow you to further restrict or expand the stability of a package beyond the scope of the minimum-stability setting.

The minimum-stability flags are:

Available options (in order of stability) are dev, alpha, beta, RC, and stable.


After spending some time, I finally understood the solution. Maybe it'll be useful for someone like me and will save you some time, so I've decided that I have to share it here.

Assuming that you have the following directory structure (relative to your project root directory):

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

In this example you may see that the local folder is meant for nested projects of your company, e.g. bar-project. But you could configure any other layout, if you wish.

Each project has to have its own composer.json file, e.g. root composer.json and local/bar-project/composer.json. Then their contents would be as follows:

(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/"
    }
  }
}

If, for example, you wish to locate each project in a separate sibling directory, as follows:

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

- then you need to link to respective directory in repositories section:

  "repositories": [
    {
      "type": "path",
      "url": "../bar-project"
    }
  ]

After that don't forget to composer update (or even rm -rf vendor && composer update -v as the docs suggest)! Under the hood, composer will create a vendor/your-company/bar-project symlink that targets to local/bar-project (or ../bar-project respectively).

Assuming that your public/index.php is just a front controller, e.g.:

<?php
require_once __DIR__ . '/../config/composition-root.php';

Then your config/composition-root.php would be:

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

참고URL : https://stackoverflow.com/questions/29994088/composer-require-local-package

반응형