PHPコンポーザーを使用してgitリポジトリを複製する


111

composerを使用して、packagistにないgithubからgitリポジトリを自動的に複製しようとしていますが、機能せず、が問題なのかわかりません。

私はそれを次のように「リポジトリ」に含める必要があると思います:

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

そして、おそらくそれを「必須」セクションにリストします。この例に似ているはずですが、機能しません。それはこのエラーを与えるだけです:

要件をインストール可能なパッケージのセットに解決できませんでした。

誰かがすでにこのようなことをやろうとしたことがありますか?

回答:


109

2013年の執筆時点では、これは1つの方法でした。Composerはより良い方法のサポートを追加しました:@igorwの回答を参照してください

リポジトリはありますか?

Git、Mercurial、SVNはComposerでサポートされています。

リポジトリへの書き込みアクセス権がありますか?

はい?

リポジトリはcomposer.jsonファイルを持っていますか

リポジトリがある場合は、次の場所に書き込むことができcomposer.jsonます。ファイルを追加するか、既存のファイルを修正し、以下のソリューションを使用しないでください。

@igorwの回答に移動

これは、リポジトリがない場合、またはリポジトリにAがなく、追加できない場合にのみ使用してください。
composer.json

これcomposer.jsonにより、パッケージとオートローディングの依存関係を含め、Composerが元のリポジトリのから読み取ることができるすべてのものが上書きされます。

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私と他の人が違いを理解できるように、その情報にリンクしてください。ありがとう。
マイクグラフ、

5
リポジトリページで説明したように、パッケージリポジトリにはすべての情報を含める必要があります。autoloadフィールドを追加しない場合、フィールドは含まれません。基本的には、すべての情報をからcomposer.jsonリポジトリ定義にコピーして貼り付ける必要があります。VCSリポジトリはその情報をVCSから直接フェッチします。の利点は、エイリアスのドキュメント私が書いたブログ投稿でbranch-alias説明されています
igorw 2013

2
なぜこれがまだ賛成されているのですか?Composerのドキュメントには、パッケージリポジトリを回避する必要があると明示的にさえ記載されています。悪い習慣の奨励をやめてください。
igorw 2013

1
私はそれをそれから何に変えることを勧めますか?
マイクグラフ、

146

実際、そのパッケージはpackagistから入手できます。この場合、カスタムリポジトリ定義は必要ありません。requireバージョンの制約に一致する(常に必要な)を必ず追加してください。

一般に、パッケージがpackagistで使用可能な場合は、VCSリポジトリを追加しないください。それはただ物事を遅くします。


packagistで入手できないパッケージの場合は、質問に示されているように、VCS(またはgit)リポジトリを使用します。その際、次のことを確認してください。

  • 「repositories」フィールドはルートcomposer.jsonで指定されています(これはルートのみのフィールドであり、必要なパッケージのリポジトリ定義は無視されます)
  • リポジトリー定義が有効なVCSリポジトリーを指している
  • タイプが「質問」のように「vcs」ではなく「git」の場合は、それが実際にgitリポジトリであることを確認してください
  • あなたは持っているrequire問題のパッケージのために
  • の制約は、requireVCSリポジトリによって提供されるバージョンと一致します。を使用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レポドキュメントはこのすべての非常によくを説明します。


composer.json使用可能なgit(または他のVCS)リポジトリがある場合は、「パッケージ」リポジトリを使用しないください。パッケージリポジトリでは、定義内のすべてのメタデータを提供する必要があり、提供されたdistおよびソースに存在するもの完全に無視されますcomposer.json。また、ほとんどの場合、適切な更新を許可しないなどの追加の制限もあります。

パッケージのリポジトリを避けます(ドキュメントも参照)。


1
おう、ありがとう!git repo DoctrineExtensionsの後で呼び出されると思ったので、見つかりませんでした。
マーティン

2
常に指定された名前を確認してくださいcomposer.json
igorw '19年

16
-1なぜこれが正解とマークされているのですか?それは確かにOPの問題を解決しましたが、ClarenceとMike Grafがその背後にあるより一般的な問題への回答を提供しました。パッケージ主義者でないプロジェクトを含める方法を探している人がDoctrineExtensionsを含めたいと思うことはほとんどありません。
aefxx 2013

2
@aefxx私の回答、実際には、requireフィールドを指定する必要があるという一般的な一般的な問題も説明しています。
igorw 2013

6
The VCS repo docs explain all of this quite well.... 何?
hek2mgl 2014年

47

次のように、gitリポジトリをcomposer.jsonに含めることができます。

"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 2017年

共有してくれてありがとう、時間を節約できました:)
metamaker '12

これは一般的になるように調整されていますが、それ以外の場合は基本的にMike Grafの回答の単純なコピーなので、例として質問内の特定のライブラリを見るよりも一般的の方が良いかどうかわかりません。
FantomX1

6

可能な場合は、composerにソースを使用するように伝えます。

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を反映していないことに注意してください!2つの間に自動リンクはなく、どちらも個別に選択できます。Composerに関する唯一の関連情報は、name内部の属性に書き込まれる名前ですcomposer.json
スヴェン

2

私の場合、私はSymfony2.3.​​xを使用しており、minimum-stabilityパラメータはデフォルトで「安定」しています(これは適切です)。packagistではなくリポジトリをインポートしたかったのですが、同じ問題「インストール可能なパッケージのセットに要件を解決できませんでした。」が発生しました。インポートしようとしたリポジトリのcomposer.jsonが最小安定性「dev」を使用しているようです。

したがって、この問題を解決するには、を確認することを忘れないでくださいminimum-stability。この投稿に記載されているのではdev-masterなく、バージョンを要求することで解決しました。master


4
私は同じ問題を持っていました、それはここで議論されます。(git commitのような)明示的な参照がある場合、のようなことができるよう"dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e"です。
Blaskovicz

1

composer.jsonGitHubのを使用する場合は、この例(VCSセクションの下)をご覧ください。

パッケージセクションは、がないパッケージ用composer.jsonです。しかし、あなたはその例にも従わなかったか、それでもうまくいきました。パッケージリポジトリについての説明を読んでください。

基本的に、composerリポジトリのに含まれるものと同じ情報を定義しますpackages.jsonが、単一のパッケージについてのみです。この場合も、最低限必要なフィールドは、名前、バージョン、およびdistまたはsourceのいずれかです。


0

リストする必要があるいくつかの重要なポイントがあるので、ここで言及されているソリューションに参加しようとします。

  1. @igorwの回答で述べたように、リポジトリへのURLは、その場合composer.jsonファイルで指定する必要があります。それほど大きな違いはありません(さらに、Githubは現在、パッケージサービスをnpmパッケージとして提供しています)。

  2. さらに、再帰的なリポジトリ定義がComposerで機能しないため、このアプローチを使用する外部ライブラリに依存できないという欠点があります。さらに、そのため、依存関係で再帰的な定義が失敗したため、「バグ」があるように見えます。ルートでリポジトリを明示的に再指定するだけでは十分ではないようですが、パッケージからのすべての依存関係も必要です。再指定されます。

作曲ファイル(午前15時13分igorwで10月18日'12答え)

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

作曲家ファイルなし(13年1月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.