PHPでパッケージを開発したいと考えていますが、GitHubまたはどこかですぐに利用できるようにしたくありません。 Packagistファイルをcomposer.json
に含めるのは簡単ですが、ローカルパッケージをcomposer.json
に追加するにはどうすればよいですか?また、パッケージを/vendor/foo/bar
(ルートcomposer.json
に対して)に構築する必要がありますか、それとも別の場所に配置する必要がありますか?
編集:私の質問は、他の全員がどのようにパッケージを書くかについてです。すべての新しいパッケージがPackagistに追加され、変更をテストするときにGitHub(またはどこでも)にコミットし、Composerを介してそれをプルダウンしますか?それは本当に非効率的です。
この質問には多くの異なるコンポーネント/標準が説明されているため、ここで可能な限り説明するようにします。具体的な質問については、PMまたはGoogleだけで説明します。
最初の質問に答えるには、「ローカルパッケージをcomposer.json
に追加するにはどうすればよいですか?」:
「ローカルパッケージの追加」とは、クラス/パッケージの自動ロードを意味する場合、PSR-4またはPSR-0またはcomposerのClassmapオプションを使用してそれを行うことができます。
PSR-0、PSR-4、およびClassmapの詳細情報が必要な場合は、Googleで検索できます。
"autoload": {
"psr-4": { "Core\\": "src/Core" } ## "standard": { "namespace" : "path/to/dir"}
}
ローカルパッケージを実際に追加する場合:
次のように、ローカルパッケージのcomposer.json
を作成します。
{
"name": "localPackage/core",
"version": "dev-master"
}
必要に応じて、他のプロパティや依存関係を指定することもできます。
composer.json
のルートファイルとしてarchive.Zip
ファイルを使用してパッケージを圧縮し、必要な場所に配置します。
ローカルパッケージを含める他のプロジェクト/パッケージで、次のようにローカルパッケージ名を必須パラメーターに追加します。
"localPackage/core": "dev-master"
repositories
パラメーターの下に以下を追加します。
"repositories" : [
{
"type": "artifact",
"url": "path/to/localPackage.Zip"
}
]
Gitにローカルパッケージがある場合、パッケージをアーカイブする必要はなく(基本的に手順2は省略)、上記の例のURLをpath/to/localPackage/.git
に置き換えるだけです。
(編集の終了)
ここで、「Composerパッケージを開発して組み込むにはどうすればよいですか?」という大きな質問に答えます。
ディレクトリ構造を決定します。一般的には次のとおりです。
/PackageRoot
/src/PackageCore
composer.json ## this is your library’s composer.json
LICENSE
composer.json
を設定します。
私のcomposer.json
ファイルの例は http://Pastebin.com/tyHT01Xg にあります。
Github および バージョンにタグ付け にアップロードします。 セマンティックバージョニング を使用します(Githubへのアップロード時にvendor
ディレクトリを除外/無視することを確認してください)。
パッケージを Packagist で登録します(ログイン後)。
コミットにv1.0.0
(または同様の)のタグを付けた場合、そのパッケージのPackagistダッシュボードに表示されます。
これで、すべてが正しく行われた場合、ライブラリをそのプロジェクトのcomposer.json
に追加することにより、ライブラリを他のプロジェクトの依存関係として使用できるようになります。
新しいリポジトリを作成する代わりに、composerにローカルパスを使用するように指示できます。
https://getcomposer.org/doc/05-repositories.md#path
たとえば、PHPプロジェクトが~/devel/projects
の下にあるとしましょう。
~/devel/projects/main_project
にメインプロジェクトがあり、~/devel/projects/local_package
に「ローカルパッケージ」がある場合があります
ローカルパッケージのcomposer構成を定義します。 ~/devel/projects/local_package/composer.json
で。
{
"name": "your_vendor_id/your_local_package",
...
}
次に、~/devel/projects/main_project/composer.json
を編集し、パスリポジトリ経由でローカルパッケージにリンクします。
"repositories": [
{
"type": "path",
"url": "../local_package",
"options": {
"symlink": true
}
}
],
"require": {
"your_vendor_id/your_local_package": "dev-master",
...
}
このリンクに関する詳細情報(私が書いたのではありませんが、このテーマについては十分な説明があります):
このスレッドに関するほとんどの答えは「知っている」ものではないようです。私はComposer自分ですが、これらの答えは誤解を招くものです。質問は、「composerパッケージを開発するにはどうすればよいですか?」.
はい。カスタムリポジトリを使用するか、未完成のパッケージをアップロードして、変更のたびに更新できます。それは正しい解決策でも、質問に対する答えでもありません。
Composerの公式ドキュメント がこれを前もって述べていないのは助けにはなりませんが、 ライブラリドキュメントページ で見出しを見ることができます:
すべてのプロジェクトはパッケージです
これは理解することが非常に重要です
前述のページは次の状態に進みます。
そのパッケージをインストール可能にするには、名前を付ける必要があります。これを行うには、
composer.json
にnameプロパティを追加します{ "name": "acme/hello-world", "require": { "monolog/monolog": "1.0.*" } }
これまでの例では、必要なパッケージがあり、名前が付けられました。 vendor/name
形式に注意してください。
基本的な使用法 ページに記載されている独自のファイルを自動ロードします。
{ "autoload": { "psr-4": {"Acme\\": "src/"} } }
これにより、src/Acme
ディレクトリの下の名前空間付きクラスファイルが自動ロードされます。
楽しみに。
次のコマンドでパッケージをインストールまたは更新します。
composer update
または
php composer.phar update
これにより、必要なパッケージがダウンロードされ、autoload.phpファイルが作成されます
プロジェクト構造は次のようになります。
src
Acme
Foo.php
vendor
monolog
...
composer.json
次にテストします。
Autoload.phpを含める
require_once 'path/to/project/vendor/autoload.php';
Foo.phpが次のようになっていると仮定します。
<?php
namespace Acme;
class Foo {
public static function bar(){
return 'baz';
}
}
?>
次に、スクリプトからこれを呼び出すことができます。
echo Acme\Foo::bar(); // baz
私が述べたかもしれない誤解を招く情報を修正してください。これは、一般的な質問の解決策と思われるものです。
ここにソリューションの要約と自分のソリューションがあります
あなたはまだ公開したくないので、あなたは開発中です、これは貧弱なオプションです。
ライブラリソースをgithubに公開したり、プライベートリポジトリの支払いをしたり、クラウドの外部サービスを使用したりすることはできません(政治的またはネットワークポリシーにより)。
サンプル実装でcomposerリポジトリパスを使用して、リリースとしてローカルZipファイルを指すことができます。libに変更を加えるたびに、Zipを再圧縮する必要があります。それを行うためのバッチファイルでは、これは厄介です。
これは近づいていますが、ライブラリを変更して実装例をテストするたびにcomposer更新を行う必要があります。これは実稼働環境を模倣しますが、面倒です。 、それは無知ではありませんが。
これはハックですが、追加するだけです:
{
"require": {
},
"autoload": {
"psr-4": {
"yourlibnamespace": "D:\\Code\\yourlib\\src\\"
}
}
}
Libからサンプル実装に「require」セクションをコピーして貼り付ける必要があることに注意してください。 「yourlibnamespace」をライブラリのネームスペースに変更し、「D:\ Code\yourlib\src \」をライブラリソースのローカルパスに変更します。
これにより、変更がすぐに反映されます。ただし、ライブラリのcomposer.jsonファイルを使用またはテストすることは一切ありません。ライブラリ.jsonの要件を変更すると、要件はまったく流れません。したがって、いくつかの大きな欠点がありますが、必要なコマンドを実行して、ライブラリの実装を最小限のコマンドですぐにテストします。
通常、src \とtests \だけがありますが、多くにはサンプルの実装が見つかるexamples \があります。アプリケーションを開発するときに、これらの実装例に貢献できます。これはローカルgit/svnリポジトリで行うことができ、libの「require」に加えてネームスペースを自動的に取得できるという利点があります。それはすべての世界の最高です。この方法をお勧めします。
開発をより効率的にするために、開発リポジトリを既にインストールされているディレクトリにシンボリックリンクするだけです。
たとえば、/Code/project-1
に/Code/package-1
にあるパッケージが必要な場合、I:
package-1
をGitHubにコミットします(プライベートにすることもできます)。project-1
にカスタムリポジトリを使用してインストールするように指示します(リポジトリ構成へのリンクについては他の回答を参照してください)。/Code/project-1/vendor/developer/package-1
を/Code/package-1
にシンボリックリンクします。そうすれば、/Code/package-1
を変更すると、すぐに/Code/project-1
に反映されます。
カスタムリポジトリを追加すると役立つかもしれません。
https://github.com/composer/composer/blob/master/doc/05-repositories.md
ライブラリでローカルgitリポジトリを非常に簡単に設定できます。
もちろん、依存関係を管理するためにcomposerを使用する場合は、ライブラリを他の場所でビルドし、ベンダーにダウンロードする必要がありますcomposer coz 。
これが、新しいComposerパッケージをローカルで作成および開発する私のフローです。
これはまだ理想的ではありませんが、小規模から中規模のパッケージで作業が完了します。
私のワークフローはOPの質問に完全に答えているわけではありませんが、他の人にとっては役立つかもしれません。
したがって、私がしていることは簡単です。ベンダーディレクトリの下に直接、またはシンボリックリンクを使用してパッケージを追加します。