Komposer membutuhkan paket lokal

106

Saya memiliki beberapa perpustakaan [Foo and Bar] yang saya kembangkan bersama, tetapi secara teknis masih merupakan hal yang terpisah. Sebelumnya saya baru saja mendefinisikan ulang pemuat otomatis menjadi suka "Foo\\": "../Foo/src", tetapi sekarang saya telah menambahkan ketergantungan Guzzle ke Foo, Bar membalik tutupnya karena itu bukan salah satu dari ketergantungannya.

Struktur direktori:

/home/user/src/
    Foo/
        src/
            FooClient.php
        composer.json
    Bar/
        src/
            BarClient.php
        composer.json

Pernyataan Pemuatan Otomatis Teoretis: [di Bar / composer.json]

"require": {
    "local": "../Foo/composer.json"
}

Kode contoh:

require('vendor/autoload.php');

$f = new \Bar\BarClient(new \Foo\FooClient());

Bagaimana saya bisa mengatasi ini tanpa menyiapkan repo Komposer lokal? Saya ingin mempertahankan ini sebagai paket terpisah, hanya yang satu memerlukan yang lain, dan untuk itu memproses ketergantungan yang lain.

edit pasca-jawaban:

Berkat infomaniak, saya telah melakukan hal berikut:

Menginisialisasi git repo:

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

Menambahkan konfigurasi komposer:

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

Lalu composer update!

Sammitch
sumber
Bagaimana json ini menentukan identitas antara referensi ke "sammitch / foo" dan alamat "/ home / sammitch / src / Foo"? Apakah mengikuti konvensi?
Sebastián Grignoli
@ SebastiánGrignoli sammitch/fooadalah nama paket dan secara harfiah tidak ada hubungannya dengan lokasinya. Akan membuat daftar paket yang tersedia berdasarkan repositori yang dikonfigurasi, dalam hal ini mengambil composer.json dari repo git lokal yang ditentukan, dan kemudian composer menangani sisanya. The sammitch/foopaket disalin ke aplikasi saat ini vendorfolder sama dengan paket lain.
Sammitch
Oh, saya rasa saya mengerti sekarang. Ini hanya repo kustom, seperti di APT, yang mungkin berisi paket "sammit / foo". Apakah saya melakukannya dengan benar?
Sebastián Grignoli
@ SebastiánGrignoli you betcha
Sammitch

Jawaban:

38

Anda dapat menggunakan fitur repositori Komposer

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

Alih-alih menggunakan format http, tentukan jalur file pada disk.

Danny Kopping
sumber
11
getcomposer.org/doc/05-repositories.md#path juga berpotensi berguna dan sepertinya bekerja lebih baik untuk saya.
Jasmine Hegman
@JasmineHarry memang! Saya telah menggunakannya juga - bagus untuk pengembangan
Danny Kopping
Untuk membuat ini menjadi jawaban yang bagus, Anda harus menunjukkan BAGAIMANA melakukannya, dan tidak hanya memberi nama fitur dan menautkan dokumen (meskipun itu juga penting). Jawaban lain di bawah ini memiliki contoh yang tepat.
rudolfbyker
173

Cara untuk link ke lokal, dalam pengembangan paket untuk add pertama dalam proyek utama Anda adalah composer.jsonsebuah repositori , seperti ini:

"repositories": [
    {
        "type": "path",
        "url": "/full/or/relative/path/to/development/package"
    }
]

Anda juga perlu memiliki versi yang ditentukan dalam paket pengembangan Anda composer.jsonatau cara saya melakukannya adalah dengan meminta paket menggunakan @dev, seperti ini:

composer require "vendorname/packagename @dev"

Ini harus menghasilkan:

- Installing vendor/packagename (dev-develop)
Symlinked from /full/or/relative/path/to/development/package

Perintah @devin require penting, komposer menggunakan ini untuk mengambil kode sumber dan menghubungkannya ke paket baru Anda.

Ini adalah bendera stabilitas yang ditambahkan ke batasan versi (lihat tautan paket ).

Ini memungkinkan Anda untuk lebih membatasi atau memperluas stabilitas paket di luar cakupan pengaturan stabilitas minimum .

Bendera stabilitas minimum adalah:

Pilihan yang tersedia (dalam rangka stabilitas) adalah dev, alpha, beta, RC, dan stable.

Dhiraj Gupta
sumber
8
Perhatikan, Anda tidak diizinkan oleh komposer untuk menentukan jalur yang ada di direktori yang sama dengan tempat composer.json.
MaPePeR
Hal yang menarik, MaPePeR saya tidak mengetahui hal ini. Namun, saya kira semua kerangka web sudah menangani ini dengan meletakkan semua dependensi ke dalam folder "vendor"? Setidaknya Yii2 melakukan ini.
Dhiraj Gupta
3
composer require "vendorname/packagename @dev"diterjemahkan ke "require":{ "vendorname/packagename": "@dev" }dalam composer.json aplikasi Anda jika Anda ingin menjalankan penginstalan komposer
Sir_Faenor
2
Tolong, tambahkan ini: komposer config repositories.local path / full / atau / relative / path / to / development / package sebagai cara yang benar untuk menambahkan repositori
basil
1
Apakah mungkin untuk memberi tahu komposer untuk menginstalnya ke folder vendor untuk prod daripada membuat symlink?
BenjaminH
7

Setelah menghabiskan beberapa waktu, saya akhirnya mengerti solusinya. Mungkin ini akan berguna untuk orang seperti saya dan akan menghemat waktu Anda, jadi saya telah memutuskan bahwa saya harus membagikannya di sini.

Dengan asumsi Anda memiliki struktur direktori berikut (relatif terhadap direktori root proyek Anda):

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

Dalam contoh ini, Anda mungkin melihat bahwa localfolder tersebut dimaksudkan untuk proyek bersarang perusahaan Anda, mis bar-project. Tetapi Anda dapat mengonfigurasi tata letak lainnya, jika Anda mau.

Setiap proyek harus memiliki composer.jsonfile sendiri-sendiri , misalnya root composer.jsondan local/bar-project/composer.json. Maka isinya adalah sebagai berikut:

(root 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/"
    }
  }
}

Jika, misalnya, Anda ingin mencari setiap proyek dalam direktori saudara yang terpisah, seperti berikut:

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

- maka Anda perlu menautkan ke direktori masing-masing di repositoriesbagian:

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

Setelah itu jangan lupa composer update(atau bahkan rm -rf vendor && composer update -vseperti yang disarankan oleh dokumen )! Di bawah tenda, komposer akan membuat vendor/your-company/bar-projectsymlink yang menargetkan local/bar-project(atau ../bar-projectmasing - masing).

Dengan asumsi Anda public/index.phphanya a front controller, misalnya:

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

Maka Anda config/composition-root.phpakan menjadi:

<?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();
Whyer
sumber
1
"rm -rf vendor / company / package" penting
Alex83690
@ Alex83690 hanya jika Anda telah menjalankan yang composer updateserupa composer.jsondan oleh karena itu Anda perlu menghapus symlink sebelumnya yang dibuat oleh komposer
whyer