นักแต่งเพลงต้องการแพ็คเกจท้องถิ่น


108

ฉันมีห้องสมุด [Foo and Bar] สองแห่งที่ฉันกำลังพัฒนาในคอนเสิร์ต แต่ก็ยังแยกกันอยู่ในทางเทคนิค ก่อนหน้านี้ฉันเพิ่งกำหนดตัวโหลดอัตโนมัติใหม่ให้ชอบ"Foo\\": "../Foo/src"แต่ตอนนี้ฉันได้เพิ่มการพึ่งพา Guzzle ให้กับ Foo แล้ว Bar ก็พลิกฝาเพราะมันไม่ใช่การพึ่งพาอย่างใดอย่างหนึ่ง

โครงสร้างไดเรกทอรี:

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

คำชี้แจง Autoload เชิงทฤษฎี: [ใน Bar / composer.json]

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

รหัสตัวอย่าง:

require('vendor/autoload.php');

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

ฉันจะแก้ไขปัญหานี้ได้อย่างไรโดยไม่ต้องตั้งค่า repo นักแต่งเพลงในเครื่อง ฉันต้องการรักษาสิ่งเหล่านี้เป็นแพ็กเกจแยกต่างหากเพียงแค่ที่ต้องการอีกแพ็กเกจและเพื่อประมวลผลการอ้างอิงของอีกฝ่าย

แก้ไขหลังคำตอบ:

ขอบคุณ infomaniac ฉันได้ทำสิ่งต่อไปนี้:

เริ่มต้น git repo:

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

เพิ่มการกำหนดค่าผู้แต่ง:

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

แล้วcomposer update!


json นี้ระบุตัวตนอย่างไรระหว่างการอ้างอิงถึง "sammitch / foo" กับที่อยู่ของ "/ home / sammitch / src / Foo" เป็นไปตามอนุสัญญาใด ๆ หรือไม่?
Sebastián Grignoli

@ SebastiánGrignoli sammitch/fooเป็นชื่อแพ็กเกจและไม่มีส่วนเกี่ยวข้องกับตำแหน่งที่ตั้ง จะสร้างรายการแพ็กเกจที่พร้อมใช้งานตาม repos ที่กำหนดค่าไว้ในกรณีนี้จะดึง composer.json จาก git repo ในเครื่องที่ระบุจากนั้นผู้สร้างจะจัดการส่วนที่เหลือ sammitch/fooแพคเกจจะถูกคัดลอกไปยังแอปปัจจุบันvendorโฟลเดอร์เดียวกับแพคเกจอื่น ๆ
Sammitch

โอ้ฉันคิดว่าฉันเข้าใจแล้ว เป็นเพียง repo ที่กำหนดเองเช่นใน APT ซึ่งอาจมีแพ็คเกจ "sammit / foo" ฉันเข้าใจถูกไหม?
Sebastián Grignoli

@ SebastiánGrignoliคุณ betcha
Sammitch

คำตอบ:


38

คุณสามารถใช้คุณสมบัติที่เก็บของนักแต่งเพลง

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

แทนที่จะใช้รูปแบบ http ให้ระบุเส้นทางไฟล์บนดิสก์



12
getcomposer.org/doc/05-repositories.md#pathอาจมีประโยชน์และดูเหมือนจะทำงานได้ดีขึ้นสำหรับฉัน
Jasmine Hegman

@JasmineHegman แน่นอน! ฉันเคยใช้แบบนั้นด้วย - ยอดเยี่ยมสำหรับการพัฒนา
Danny Kopping

เพื่อให้เป็นคำตอบที่ดีคุณควรแสดงวิธีทำไม่ใช่แค่ตั้งชื่อคุณลักษณะและเชื่อมโยงเอกสาร (แม้ว่าจะมีความสำคัญเช่นกัน) คำตอบอื่น ๆ ด้านล่างมีตัวอย่างที่เหมาะสม
rudolfbyker

174

วิธีที่จะเชื่อมโยงไปยังท้องถิ่นแพคเกจในการพัฒนาแรกคือการเพิ่มในโครงการหลักของคุณเป็นพื้นที่เก็บข้อมูลเช่นนี้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

@devในคำสั่งต้องเป็นสิ่งสำคัญที่นักแต่งเพลงนี้ใช้รถกระบะซอร์สโค้ดและ symlink มันแพคเกจใหม่ของคุณ

เป็นค่าสถานะความเสถียรที่เพิ่มเข้ามาในข้อ จำกัด ของเวอร์ชัน (ดูลิงก์แพ็คเกจ )

สิ่งเหล่านี้ช่วยให้คุณสามารถ จำกัด หรือขยายความเสถียรของแพ็คเกจเพิ่มเติมนอกเหนือจากขอบเขตของการ ตั้งค่าความเสถียรขั้นต่ำ

แฟล็กความเสถียรขั้นต่ำคือ:

ตัวเลือกที่ใช้ได้ (ตามลำดับของความมั่นคง) เป็นdev, alpha, beta, และRCstable


8
โปรดทราบว่าคุณไม่ได้รับอนุญาตจากผู้แต่งให้ระบุพา ธ ที่อยู่ในไดเร็กทอรีเดียวกันกับที่ composer.json ถูกวางไว้
MaPePeR

จุดที่น่าสนใจ MaPePeR ฉันไม่รู้เรื่องนี้ อย่างไรก็ตามฉันเดาว่าเว็บเฟรมเวิร์กทั้งหมดดูแลเรื่องนี้อยู่แล้วโดยใส่การอ้างอิงทั้งหมดลงในโฟลเดอร์ "ผู้ขาย"? อย่างน้อย Yii2 ก็ทำเช่นนี้
Dhiraj Gupta

3
composer require "vendorname/packagename @dev"แปลเป็น"require":{ "vendorname/packagename": "@dev" }ใน composer.json ของแอปของคุณหากคุณต้องการเรียกใช้การติดตั้งนักแต่งเพลง
Sir_Faenor

2
กรุณาเพิ่มนี้: นักแต่งการตั้งค่า repositories.local เส้นทาง / เต็ม / หรือ / ญาติ / เส้นทาง / เพื่อ / พัฒนา / แพ็กเกจเป็นวิธีที่ถูกต้องของการเพิ่มที่เก็บ
โหระพา

1
เป็นไปได้หรือไม่ที่จะบอกให้นักแต่งเพลงติดตั้งลงในโฟลเดอร์ผู้ขายสำหรับ prod แทนที่จะสร้าง symlink
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ตามที่เอกสารแนะนำ )! ภายใต้ประทุนผู้แต่งจะสร้างvendor/your-company/bar-projectsymlink ที่กำหนดเป้าหมายไปที่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

@ Alex83690 เฉพาะในกรณีที่คุณได้รันcomposer updateด้วยสิ่งที่คล้ายกันcomposer.jsonแล้วดังนั้นคุณต้องลบ symlink ก่อนหน้านี้ที่สร้างโดยผู้แต่ง
ทำไม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.