PHP composer를 사용하여 git repo 복제


111

composer 를 사용 하여 packagist에 없는 github에서 git 저장소를 자동으로 복제 하려고 하지만 작동하지 않으며 내가 뭘 잘못하고 있는지 알아낼 수 없습니다.

다음과 같이 "저장소"에 포함시켜야한다고 생각합니다.

"repositories": [
    {
        "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
        "type": "git"
    }
],

그런 다음 "require"섹션에 나열합니다. 이 예제 와 비슷해야 하지만 작동하지 않습니다. 이 오류가 발생합니다.

설치 가능한 패키지 세트로 요구 사항을 해결할 수 없습니다.

이미 이와 같은 일을 시도한 사람이 있습니까?

답변:


109

2013 년 글을 쓰는 시점에서 이것은 그렇게하는 한 가지 방법이었습니다. Composer는 더 나은 방법에 대한 지원을 추가했습니다. @igorw의 답변보기

저장소가 있습니까?

Git, Mercurial 및 SVN은 Composer에서 지원됩니다.

저장소에 대한 쓰기 액세스 권한이 있습니까?

예?

저장소에 composer.json파일이 있습니까?

리포지토리가있는 경우 쓸 수있는 composer.json파일 : 파일을 추가 하거나 기존 파일을 수정하고 아래 솔루션을 사용하지 마십시오.

@igorw의 답변으로 이동

리포지토리가없는 경우
또는 리포지토리에composer.json 당신은 그것을 추가 할 수 없습니다

이것은 Composer가 composer.json패키지의 의존성 및 자동 로딩을 포함하여 원본 저장소에서 읽을 수있는 모든 것을 재정의합니다 .

package유형을 사용하면 모든 것을 올바르게 정의해야하는 부담이 사용자에게 전달됩니다. 더 쉬운 방법은 composer.json저장소에 파일을 저장하고 사용하는 것입니다.

이 솔루션은 변경할 수없는 버려진 ZIP 다운로드 또는 읽기만 가능한 저장소가 있지만 더 이상 유지되지 않는 드문 경우에만 해당됩니다.

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}

7
VCS 저장소를 패키지 저장소로 바꾸는 것은 나쁜 생각입니다. 대상 리포지토리에 이미가 composer.json있으므로 vcs 리포지토리를 사용하십시오. 귀하의 예제는 또한 자동로드를 중단하고 branch-alias.
igorw 2013

1
@igorw 저와 다른 사람이 차이점을 이해할 수 있도록 해당 정보에 연결해 주시겠습니까? 감사.
Mike Graf 2013

5
리포지토리 페이지에 설명 대로 패키지 리포지토리 에는 모든 정보가 포함되어야합니다. autoload필드를 추가하지 않으면 포함되지 않습니다. 기본적으로 모든 정보를 composer.json저장소 정의 에 복사하여 붙여 넣어야합니다. VCS 저장소는 VCS에서 직접 해당 정보를 가져옵니다. 의 이점은 내가 작성한 별칭 문서블로그 게시물에branch-alias 설명되어 있습니다.
igorw 2013

2
왜 여전히 찬성 투표를하고 있습니까? 작성기 문서 는 패키지 저장소를 피해야한다고 명시 적으로 명시 합니다. 나쁜 습관을 조장하지 마십시오.
igorw 2013-08-18

1
그때로 변경하는 것이 좋습니다.
Mike Graf

146

사실 그 패키지는 packagist를 통해 구할 수 있습니다 . 이 경우 사용자 지정 저장소 정의가 필요하지 않습니다. require일치하는 버전 제약 조건으로 (항상 필요함) 을 추가했는지 확인하십시오 .

일반적으로 packagist에서 패키지를 사용할 수 있는 경우 VCS 저장소를 추가 하지 마십시오 . 그것은 단지 일을 느리게 할 것입니다.


packagist를 통해 사용할 수없는 패키지 의 경우 질문에 표시된대로 VCS (또는 git) 저장소를 사용하십시오. 그럴 때 다음 사항을 확인하십시오.

  • "repositories"필드는 루트 composer.json에 지정됩니다 (루트 전용 필드이며 필수 패키지의 저장소 정의는 무시 됨).
  • 저장소 정의는 유효한 VCS 저장소를 가리 킵니다.
  • 유형이 "vcs"대신 "git"인 경우 (질문에서와 같이) 실제로 git repo인지 확인하십시오.
  • 당신은이 require질문에 패키지
  • 의 제약 조건 require은 VCS 저장소에서 제공하는 버전과 일치합니다. 사용 composer show <packagename>가능한 버전을 찾는 데 사용할 수 있습니다. 이 경우 ~2.3좋은 선택이 될 것입니다.
  • 의 이름 require이 리모컨의 이름과 일치합니다 composer.json. 이 경우 gedmo/doctrine-extensions.

다음은 composer.jsonVCS 저장소를 통해 동일한 패키지를 설치 하는 샘플 입니다.

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

VCS REPO 문서는 이 모든 것을 아주 잘 설명합니다.


기호가있는 자식 (또는 다른 VCS) 저장소가있는 경우 composer.json사용할 수를 하지 않습니다 는 "패키지"의 repo를 사용합니다. 패키지 저장소 는 정의에있는 모든 메타 데이터 를 제공해야 하며 제공된 dist 및 소스에있는 모든 항목 을 완전히 무시 합니다 composer.json. 또한 대부분의 경우 적절한 업데이트를 허용하지 않는 것과 같은 추가 제한 사항이 있습니다.

패키지 repos를 피하십시오 ( 문서 참조 ).


1
고마워요! git repo DoctrineExtensions 이후에 호출 될 것이라고 생각했기 때문에 찾지 못했습니다.
마틴

2
항상에 주어진 이름을보십시오 composer.json.
igorw

16
-1 이것이 정답으로 표시된 이유는 무엇입니까? 그것은 확실히 OP의 문제를 해결했지만 Clarence와 Mike Graf는 그 뒤에있는보다 일반적인 문제에 대한 답변을 제공했습니다. 패키지주의가 아닌 프로젝트를 포함하는 방법을 찾는 사람이 DoctrineExtensions를 포함하고 싶어 할 가능성은 거의 없습니다.
aefxx

2
@aefxx 내 대답 실제로 require필드를 지정해야 한다는 일반적인 일반적인 문제를 설명 합니다.
igorw

6
The VCS repo docs explain all of this quite well.... 뭐?
hek2mgl

47

다음과 같이 composer.json에 git 저장소를 포함 할 수 있습니다.

"repositories": [
{
    "type": "package",
    "package": {
        "name": "example-package-name", //give package name to anything, must be unique
        "version": "1.0",
        "source": {
            "url": "https://github.com/example-package-name.git", //git url
            "type": "git",
            "reference": "master" //git branch-name
        }
    }
}],
"require" : {
  "example-package-name": "1.0"
}

1
위의 다른 답변에서 설명한대로 : 저장소가있는 composer.json경우 가능 하면 파일을 추가 하십시오.
스벤

@Sven ... 그렇지 않으면 특정 커밋을 지정할 수 없기 때문에?
Cees Timmerman

공유해 주셔서 감사합니다. 시간을 절약했습니다. :)
metamaker 2017-08-12

이것은 일반적으로 조정되지만 기본적으로 Mike Graf의 대답의 일반 사본이므로 질문에서 특정 라이브러리를 예로 보는 것보다 일반이 더 나은지 확실하지 않습니다.
FantomX1

6

가능한 경우 작곡가에게 소스를 사용하도록 지시하십시오.

composer update --prefer-source

또는:

composer install --prefer-source

그런 다음 압축을 푼 tarball 대신 복제 된 저장소로 패키지를 가져 오므로 일부 변경하고 다시 커밋 할 수 있습니다. 물론 저장소에 대한 쓰기 / 푸시 권한이 있고 Composer가 프로젝트의 저장소에 대해 알고 있다고 가정합니다.

면책 조항 : 조금 다른 질문에 대답 할 수있을 것 같지만이 질문을 발견했을 때 찾던 것이 었으므로 다른 사람들에게도 도움이되기를 바랍니다.

Composer가 프로젝트의 저장소가 어디에 있는지 모르거나 프로젝트에 적절한 composer.json이없는 경우 상황은 좀 더 복잡하지만 다른 사람들은 이미 그러한 시나리오에 응답했습니다.


3

다음 오류가 발생했습니다. The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

다른 리포지토리를 포크하여 직접 변경하는 경우 새 리포지토리로 끝납니다.

예 :

https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git

새 URL은 composer.json의 저장소 섹션으로 이동해야합니다.

my-foo/barrequire 섹션에서 와 같이 포크를 참조하려는 경우 composer.json새 저장소 내부의 파일 에서 패키지 이름을 변경해야합니다 .

{
    "name":         "foo/bar",

=>

{
    "name":         "my-foo/bar",

방금 분기 한 경우 가장 쉬운 방법은 github에서 바로 편집하는 것입니다.


패키지 이름은 저장소를 읽을 수있는 URL을 반영하지 않습니다. 둘 사이에는 자동 링크가 없으며 둘 다 독립적으로 선택할 수 있습니다. Composer와 관련된 유일한 정보는 name내부 속성에 기록 된 이름입니다 composer.json.
Sven

2

제 경우에는 Symfony2.3.x를 사용하고 최소 안정성 매개 변수는 기본적으로 "stable"(좋습니다)입니다. packagist에없는 저장소를 가져오고 싶었지만 "설치 가능한 패키지 집합으로 요구 사항을 해결할 수 없습니다."라는 동일한 문제가 발생했습니다. 내가 가져 오려고 시도한 저장소의 composer.json이 최소 안정성 "dev"를 사용하는 것으로 나타났습니다.

따라서이 문제를 해결하려면 minimum-stability. 이 게시물에 명시된 dev-master대신 버전 을 요구하여 해결했습니다 .master


4
나는 여기에서 논의되는 동일한 문제가 있었다 . 명시 적 참조 (예 : git 커밋)가있는 경우 "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e".
Blaskovicz

1

composer.jsonGitHub에서 를 사용하려면 이 예제 (VCS 섹션 아래)를 참조하십시오.

패키지 섹션은 composer.json. 그러나 그 예를 따르지 않았거나 효과가 있었을 것입니다. 패키지 저장소에 대한 내용을 읽으십시오.

기본적으로 composer 저장소의에 포함 된 동일한 정보를 정의 packages.json하지만 단일 패키지에 대해서만 정의합니다. 다시 말하지만, 최소 필수 필드는 이름, 버전 및 dist 또는 source 중 하나입니다.


0

여기에 나열된 솔루션에 대한 몇 가지 중요한 사항이 있으므로 여기에 언급 된 솔루션에 참여하려고합니다.

  1. @igorw의 답변에서 언급했듯이 저장소에 대한 URL은 composer.json 파일에 지정된 경우에 있어야하지만 두 경우 모두 composer.json이 있어야하기 때문에 (@Mike Graf와 달리) Packagist에 게시하는 것은 그다지 다르지 않습니다 (또한 Github는 현재 패키지 서비스를 npm 패키지로 제공합니다). 가입 한 후에는 패키지 전문가 인터페이스에서 문자 그대로 URL을 입력하는 대신 차이점 만 있습니다.

  2. 또한 재귀 저장소 정의가 Composer에서 작동하지 않기 때문에이 접근 방식을 사용하는 외부 라이브러리에 의존 할 수 없다는 단점이 있습니다. 게다가 그로 인해 "버그"가있는 것 같습니다. 재귀 적 정의가 종속성에서 실패했기 때문에 루트에서 명시 적으로 리포지토리를 재지 정하는 것만으로는 충분하지 않지만 패키지의 모든 종속성도 재 지정 될 수 있습니다.

작곡가 파일 (15시 13분 igorw에서 10월 18일 '12 대답)

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

작곡가 파일 없음 (2017-01-23 17:28에 Mike Graf에 답변 함)

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.