2012-10-18 18 views
70

packagistにないgitリポジトリを自動的に複製するにはcomposerを使用しようとしていますが、正しく機能しないとわかりません。PHPコンポーザを使用してgit repoをクローンします

は、私はそうのような「リポジトリ」の中で、それを含めることがあると思う:

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

、その後はおそらく、「必要」で、それをリストアップ。 this exampleと似ているはずですが、動作しません。

Your requirements could not be resolved to an installable set of packages.

誰もこのようなことをしたことがありますか?

答えて

75

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

あなたにはリポジトリがありますか?

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

は、リポジトリへの書き込みアクセスを持っていますか?

はい? composer.jsonファイルを追加、または既存のものを修正して、以下のソリューションを使用しないでください:あなたは、自分の書き込み権限のあるリポジトリを持っている場合

は、リポジトリはcomposer.json FILE

を持っています。リポジトリ
またはリポジトリがcomposer.jsonを持っていない、あなたがそれに

を追加できない場合をお持ちでない場合は、これを使用ONLYのanswer

を@igorwする

ゴーこれにより、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" 
} 
+5

VCSリポジトリをパッケージリポジトリに置き換えるのは悪い考えです。ターゲットリポジトリには既に 'composer.json'がありますので、vcsリポジトリを使用してください。あなたの例では、オートローディングが中断され、 'branch-alias'も無視されます。 – igorw

+1

@igorwあなたはその情報にリンクして、私と他の人が違いを理解できるようにしてください。ありがとう。 –

+4

[リポジトリのページ](http://getcomposer.org/doc/05-repositories.md#package-2)で説明したように、パッケージレポにはすべての情報が含まれている必要があります。 'autoload'フィールドを追加しなければ、それは含まれません。基本的には、 'composer.json'からすべての情報をコピーしてレポ定義に貼り付ける必要があります。 VCS repoはその情報をVCSから直接取得します。 'branch-alias'の利点は、[aliases doc](http://getcomposer.org/doc/articles/aliases.md#branch-alias)と[私が書いたブログ記事](https:// igor.io/2013/01/07/composer-versioning.html)。 – igorw

1

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

パッケージセクションは、composer.jsonがないパッケージ用です。しかし、あなたはその例にも従わなかったし、それもうまくいっただろう。それはパッケージリポジトリについて言うことを読んでください:実際is available through packagist

Basically, you define the same information that is included in the composer repository's packages.json , but only for a single package. Again, the minimum required fields are name, version, and either of dist or source.

102

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

一般に、パッケージがpackagistで利用可能であれば、にVCSレポを追加しないでください。それは物事を遅くするだけです。 packagist経由で利用できないパッケージの場合


、あなたの質問に示すように、VCS(またはgitの)リポジトリを使用。あなたが行う場合は、次のことを確認します。

  • 「リポジトリ」フィールドは、ルートcomposer.jsonに指定されているが、
  • リポジトリ定義ポイントを(それは、必要なパッケージのリポジトリの定義は無視されているルート専用フィールドです)有効なVCSレポ
  • タイプは(あなたの質問のように)ではなく、「VCS」の「gitの」である場合には、あなたが質問
  • にパッケージの requireを持って、それが実際にGitのレポ
  • であることを確認してください
  • requireの制約は、 dをVCSレポで表示します。 composer show <packagename>を使用して、使用可能なバージョンを見つけることができます。この場合、~2.3が良い選択肢になります。
  • requireの名前は、リモートの名前と一致しますcomposer.json。この場合、それはgedmo/doctrine-extensionsです。ここで

VCSのレポを経由して、同じパッケージをインストールしたサンプルcomposer.jsonは次のとおりです。

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

VCS repo docsは非常によく、このすべてを説明します。は、「パッケージ」のレポを使用していない


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

パッケージrepos(see also the docs)を避けてください。

+1

ありがとう! git repo DoctrineExtensionsの後に呼び出されると思ったので、私はそれを見つけられませんでした。 – martin

+1

'composer.json'で与えられた名前を常に見てください。 – igorw

+0

ありがとう、次回は、よりスマートになります:)。 – martin

2

私の場合、私はSymfony2.3.​​xを使用し、最小安定度パラメータはデフォルトでは「安定」(これは良い)です。私はpackagistではなくrepoをインポートしたいのですが、 "あなたの要件は、インストール可能なパッケージのセットに解決できませんでした。"という同じ問題がありました。 私がインポートしようとしたレポのcomposer.jsonは、最低安定度の「dev」を使用していたようです。

だから、この問題を解決するために、minimum-stabilityを確認することを忘れないでください。私はこのpostに記載されているようにmasterの代わりにdev-masterバージョンを要求することによって解決しました。

+2

私は同じ問題を抱えていましたが、これについては[こちら](https://getcomposer.org/doc/04-schema.md#package-links)で議論しています。明示的なref(gitコミットのような)がある場合、 '" dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e "'のようなことができるようです。 – Blaskovicz

31

あなたはこのよう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

+0

@Sven ...そうでなければ特定のコミットを指定することは不可能ですから? –

+0

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

2

私は次のようなエラーに遭遇しました: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/barと表示したい場合は、新しいレポのcomposer.jsonファイルでパッケージの名前を変更する必要があります。

{ 
    "name":   "foo/bar", 

=> 

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

これを行う最も簡単な方法をフォークした場合は、githubのすぐ内側で編集してください。あなたには、いくつかの変更を加え、コミットすることができるように、そして、あなたの代わりに抽出されたtarボールのクローン化されたリポジトリとしてパッケージを取得します

composer install --prefer-source 

composer update --prefer-source 

または:

+0

パッケージ名は、リポジトリを読むことができる場所のURLを反映していません。両者の間に自動リンクはなく、どちらも独立して選択できます。 Composerに関する唯一の関連情報は、 'composer.json'内の' name'属性に書き込まれた名前です。 – Sven

1

ただソース利用可能な場合に使用する作曲を伝えますそれらを戻す。もちろん、リポジトリへの書き込み権限とプッシュ権限を持っていると仮定し、Composerはプロジェクトのリポジトリを知っています。

免責事項:私は、私は少し異なる質問に答えかもしれないと思うが、これは、私はこの質問を見つけたので、私はそれは同様に他の人に役立つことを願っていたときに私が探していたものでした。

プロジェクトのリポジトリがどこにあるComposerは、知らない、またはプロジェクトが正しいcomposer.jsonを持っていない場合は、状況は少し複雑ですが、他の人は、すでにこのようなシナリオに答え。

関連する問題