Composerにはローカルパッケージが必要


105

私が共同で開発しているライブラリ[Foo and Bar]がいくつかありますが、それでも技術的には別のものです。以前はオートローダーをlike "Foo\\": "../Foo/src"に再定義しただけですが、FooにGuzzle依存関係を追加したので、Barは依存関係の1つではないため、ふたを反転します。

ディレクトリ構造:

/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リポジトリを初期化:

cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"

composer設定を追加しました:

"require": {
    "sammitch/foo": "dev-master"
},
"repositories": [{
    "type": "vcs",
    "url": "/home/sammitch/src/Foo"
}],

そしてcomposer update


このjsonは、「sammitch / foo」への参照と「/ home / sammitch / src / Foo」のアドレスとの間のIDをどのように指定しますか?慣例に従っていますか?
セバスティアンGrignoli

@SebastiánGrignoli sammitch/fooはパッケージ名であり、文字通り、パッケージの場所とは関係ありません。構成されたリポジトリに基づいて使用可能なパッケージのリストを作成します。この場合、指定されたローカルgitリポジトリからcomposer.jsonをフェッチし、composerが残りを処理します。sammitch/fooパッケージは、現在のアプリケーションのにコピーされvendor、他のパッケージと同じフォルダ。
Sammitch

ああ、もうわかったと思います。APTのようなカスタムリポジトリであり、たまたま "sammit / foo"パッケージが含まれている可能性があります。私はそれを正しく理解しましたか?
セバスティアンGrignoli

@SebastiánGrignoliyou betcha
Sammitch

回答:


37

Composerのリポジトリ機能を使用できます

https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository

http形式を使用する代わりに、ディスク上のファイルパスを指定します。



11
getcomposer.org/doc/05-repositories.md#pathも潜在的に有用であり、私にとってはうまく機能するように見えました。
ジャスミンヘグマン2016年

@JasmineHegman確かに!私もそれを使用しました-開発に最適
Danny Kopping 2016年

これを適切な回答にするには、機能に名前を付けてドキュメントをリンクするだけでなく、その方法を示す必要があります(これも重要です)。以下の他の回答には適切な例があります。
rudolfbyker

171

ローカルの開発中パッケージにリンクする方法は、最初にメインプロジェクトのリポジトリに次のように追加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

@devrequireコマンドのinは重要です。composerはこれを使用してソースコードを取得し、新しいパッケージにシンボリックリンクします。

これは、バージョン制約に追加された安定性フラグです(パッケージリンクを参照)。

これらにより、パッケージの安定性を、最小安定性 設定の範囲を超えてさらに制限または拡張できます。

最小安定性フラグは次のとおりです。

(安定性のために)使用可能なオプションはdevalphabetaRC、とstable


8
composerでは、composer.jsonが配置されているのと同じディレクトリにあるパスを指定することはできません。
MaPePeR

興味深い点、MaPePeR私はこれを知りませんでした。ただし、すべてのWebフレームワークがすべての依存関係を "vendor"フォルダーに配置することでこれをすでに処理していると思いますか?Yii2は少なくともこれを行います。
Dhiraj Gupta

3
composer require "vendorname/packagename @dev""require":{ "vendorname/packagename": "@dev" }composer installを実行する場合は、アプリのcomposer.jsonに変換されます
Sir_Faenor

2
これを追加してください:リポジトリを追加する正しい方法としてcomposer config repositories.local path / full / or / relative / path / to / development / package
basil

1
シンボリックリンクを作成する代わりに、製品のベンダーフォルダーにインストールするようにcomposerに指示することは可能ですか?
BenjaminH

7

少し時間をかけて、ようやく解決策を理解しました。多分それは私のような誰かにとって有用であり、あなたの時間を節約するでしょうので、私はここでそれを共有する必要があると決めました。

(プロジェクトのルートディレクトリに対して)次のディレクトリ構造があると仮定します。

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

この例では、localフォルダが会社のネストされたプロジェクト用であることがわかりますbar-project。ただし、必要に応じて、他のレイアウトを構成できます。

各プロジェクトにはcomposer.json、ルートcomposer.jsonやなどの独自のファイルが必要local/bar-project/composer.jsonです。次に、その内容は次のようになります。

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

たとえば、次のように、各プロジェクトを個別の兄弟ディレクトリに配置する場合は、

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

-次に、repositoriesセクションの各ディレクトリにリンクする必要があります。

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

その後に忘れてはいけないcomposer update(あるいはrm -rf vendor && composer update -vとしてドキュメントが提案します)!内部では、composerは(またはそれぞれ)vendor/your-company/bar-projectをターゲットとするシンボリックリンクを作成します。local/bar-project../bar-project

あなたpublic/index.phpが単にであると仮定するとfront controller、例えば:

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

それからあなたconfig/composition-root.phpは:

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

1
「rm -rf vendor / company / package」は重要です
Alex83690 '14

@ Alex83690はcomposer update、類似のものですでに実行しているcomposer.jsonため、composerによって作成された以前のシンボリックリンクを削除する必要がある場合のみ
Octer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.