Besteci yerel paket gerektiriyor


108

Birlikte geliştirdiğim birkaç kütüphanem [Foo ve Bar] var, ancak yine de teknik olarak ayrı şeyler. Önceden otomatik yükleyiciyi beğenmek için yeniden tanımlamıştım "Foo\\": "../Foo/src", ancak şimdi Foo'ya bir Guzzle bağımlılığı eklediğim için, Bar, bağımlılıklarından biri olmadığı için kapağını çeviriyor.

Dizin yapısı:

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

Teorik Otomatik Yükleme İfadesi: [Bar / composer.json dosyasında]

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

Örnek kod:

require('vendor/autoload.php');

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

Yerel bir Composer deposu kurmadan bunu nasıl çözebilirim? Bunları ayrı paketler olarak tutmak istiyorum, sadece biri diğerini gerektiriyor ve bu nedenle diğerinin bağımlılıklarını işler.

yanıt sonrası düzenleme:

İnfomaniac sayesinde şunları yaptım:

Git deposunu başlattı:

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

Besteci yapılandırması eklendi:

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

Ve sonra composer update!


Bu json, "sammitch / foo" referansı ile "/ home / sammitch / src / Foo" adresi arasındaki kimliği nasıl belirler? Herhangi bir kongre takip ediyor mu?
Sebastián Grignoli

@ SebastiánGrignoli sammitch/foopaketin adıdır ve kelimenin tam anlamıyla bulunduğu yerle ilgisi yoktur. Yapılandırılmış depolarına dayalı olarak mevcut paketlerin bir listesini oluşturacak, bu durumda composer.json'u belirtilen yerel git deposundan getirecek ve ardından besteci geri kalanını halledecektir. sammitch/fooPaket akımı uygulamanın kopyalanır vendorklasörün başka paket olarak aynı.
Sammitch

Oh, sanırım şimdi anladım. Bu, APT'de olduğu gibi, "sammit / foo" paketini içerebilecek özel bir depo. Doğru anladım mı?
Sebastián Grignoli

@ SebastiánGrignoli you
betcha

Yanıtlar:


38

Composer'in depo özelliğini kullanabilirsiniz

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

Http formatını kullanmak yerine, diskte bir dosya yolu belirtin.



12
getcomposer.org/doc/05-repositories.md#path da potansiyel olarak yararlı ve benim için daha iyi çalışıyor gibi görünüyor.
Jasmine Hegman

@YaseminHegman gerçekten! Bunu da kullandım - geliştirme için harika
Danny Kopping

Bunu iyi bir cevap haline getirmek için, bunu NASIL yapacağınızı göstermelisiniz ve sadece özelliği adlandırıp dokümanları bağlamanız gerekir (bu da önemlidir). Aşağıdaki diğer cevapların uygun örnekleri vardır.
rudolfbyker

174

Yerel, geliştirilmekte olan bir pakete bağlanmanın yolu, önce ana projenizin composer.jsonbir havuzuna aşağıdaki gibi eklemektir :

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

Ayrıca ya geliştirme paketinizde belirtilen bir sürüme sahip olmanız gerekir ya da composer.jsonbenim bunu yapma şeklim @dev, aşağıdaki gibi paketi kullanmayı zorunlu kılmaktır :

composer require "vendorname/packagename @dev"

Çıktısı olmalıdır:

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

İn @devthe required komutu önemlidir, composer bunu kaynak kodunu almak ve yeni paketinize sembolik bağlamak için kullanır.

Sürüm kısıtlamasına eklenen bir kararlılık bayrağı ( paket bağlantısına bakın ).

Bunlar, bir paketin stabilitesini minimum stabilite ayarının kapsamının ötesinde daha da kısıtlamanıza veya genişletmenize olanak tanır .

Minimum kararlılık bayrakları şunlardır:

(İstikrar sırasına göre) Mevcut seçenekler dev, alpha, beta, RC, ve stable.


8
Composer.json ile aynı dizinde bulunan bir yolu belirtmek için composer tarafından izin verilmediğini unutmayın.
MAPePeR

İlginç bir nokta, MAPePeR Bunu bilmiyordum. Bununla birlikte, sanırım tüm web çerçeveleri tüm bağımlılıkları bir "satıcı" klasörüne koyarak bunu zaten hallediyor? Yii2 bunu en azından yapıyor.
Dhiraj Gupta

3
composer require "vendorname/packagename @dev"çevirir "require":{ "vendorname/packagename": "@dev" }sen besteci yüklemek çalıştırmak istiyorsanız uygulamanızın composer.json içinde
Sir_Faenor

2
Lütfen şunu ekleyin: composer config repositories.local path / full / or / relative / path / to / development / package as true way to add repository
basil

1
Composer'a bir symlink oluşturmak yerine onu prod için satıcılar klasörüne yüklemesini söylemek mümkün müdür?
benjaminh

7

Biraz zaman geçirdikten sonra nihayet çözümü anladım. Belki benim gibi biri için yararlı olur ve size biraz zaman kazandırır, bu yüzden burada paylaşmam gerektiğine karar verdim.

Aşağıdaki dizin yapısına sahip olduğunuzu varsayarsak (proje kök dizininize göre):

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

Bu örnekte, localklasörün şirketinizin iç içe geçmiş projeleri için olduğunu görebilirsiniz , örn bar-project. Ancak isterseniz başka herhangi bir düzeni yapılandırabilirsiniz.

Her projenin kendi composer.jsondosyası olmalıdır, örneğin, kök composer.jsonve local/bar-project/composer.json. Daha sonra içerikleri aşağıdaki gibi olacaktır:

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

Örneğin, her bir projeyi aşağıdaki gibi ayrı bir kardeş dizinde konumlandırmak isterseniz:

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

- o zaman repositoriesbölümdeki ilgili dizine bağlanmanız gerekir :

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

Bundan sonra unutma composer update(hatta rm -rf vendor && composer update -volarak dokümanlar önermek )! Başlık altında, besteci vendor/your-company/bar-projecthedefleyen local/bar-project(veya ../bar-projectsırasıyla) bir sembolik bağ oluşturacaktır .

public/index.phpYalnızca bir olduğunu varsayarsak front controller, örneğin:

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

O zaman senin config/composition-root.phpolacaksın:

<?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 satıcı / şirket / paket" önemlidir
Alex83690

@ Alex83690 yalnızca zaten composer updatebenzer ile çalıştırdıysanız composer.jsonve bu nedenle besteci tarafından oluşturulan önceki sembolik bağlantıyı kaldırmanız gerekiyorsa
whyer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.