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
, andstable
.
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
'program story' 카테고리의 다른 글
stdcall 및 cdecl (0) | 2020.09.25 |
---|---|
`staticmethod` 및`abc.abstractmethod` : 혼합 될까요? (0) | 2020.09.24 |
매개 변수가있는 기본 클래스 생성자를 통한 상속 (0) | 2020.09.24 |
프라 미스 함수에 매개 변수를 전달하는 방법 (0) | 2020.09.24 |
IRB에서 .rb 파일을 실행하는 방법은 무엇입니까? (0) | 2020.09.24 |