संगीतकार को स्थानीय पैकेज की आवश्यकता होती है


106

मुझे कुछ पुस्तकालय [फू और बार] मिले हैं, जिन्हें मैं संगीत कार्यक्रम में विकसित कर रहा हूं, लेकिन अभी भी तकनीकी रूप से अलग चीजें हैं। पहले मैंने ऑटोलैडर को फिर से परिभाषित करने के लिए पसंद किया है "Foo\\": "../Foo/src", लेकिन अब जब मैंने फू में एक गज़ल निर्भरता जोड़ दी है, तो बार यह ढक्कन है क्योंकि यह इसकी निर्भरता में से एक नहीं है।

निर्देशिका संरचना:

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

सैद्धांतिक ऑटोलैड स्टेटमेंट: [बार / कंपोजर.जॉन में]

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

उदाहरण कोड:

require('vendor/autoload.php');

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

स्थानीय संगीतकार रेपो स्थापित किए बिना मैं इसे कैसे हल कर सकता हूं? मैं इन्हें अलग पैकेज के रूप में बनाए रखना चाहता हूं, बस एक को दूसरे की आवश्यकता होती है, और इसके बाद दूसरे की निर्भरता को संसाधित करता है।

उत्तर-उत्तर संपादित करें:

शिशु के लिए धन्यवाद मैंने निम्नलिखित कार्य किया है:

आरंभिक प्रतिनिधि रेपो:

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!


यह संस्मरण "sammitch / foo" और "/ home / sammitch / src / Foo" के संदर्भ के बीच पहचान को कैसे निर्दिष्ट करता है? क्या यह किसी सम्मेलन का अनुसरण कर रहा है?
सेबेस्टियन ग्रिग्नोली

@ सेबस्टियनग्रेग्नोली sammitch/fooपैकेज का नाम है और इसका शाब्दिक अर्थ यह नहीं है कि यह कहाँ स्थित है। उपलब्ध कॉन्फ़िगर किए गए रेपो के आधार पर उपलब्ध पैकेजों की एक सूची का निर्माण करेगा, इस मामले में निर्दिष्ट स्थानीय गिट रेपो से कंपोजर.जॉन लाने के लिए, और फिर संगीतकार बाकी को संभालता है। sammitch/fooपैकेज वर्तमान एप्लिकेशन की कॉपी किया जाता है vendorफ़ोल्डर किसी अन्य पैकेज के रूप में ही।
सममिच

ओह, मुझे लगता है कि मैं इसे अभी प्राप्त करता हूं। यह एपीटी की तरह सिर्फ एक कस्टम रेपो है, जिसमें "समिट / फू" पैकेज शामिल हो सकता है। क्या मैने सही किया?
सेबेस्टियन ग्रिग्नोली

@ सेबेस्टियनग्रिग्नोली आप
बेट्चा

जवाबों:


38

आप संगीतकार की रिपॉजिटरी सुविधा का उपयोग कर सकते हैं

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

Http प्रारूप का उपयोग करने के बजाय, डिस्क पर एक फ़ाइल पथ निर्दिष्ट करें।



11
getcomposer.org/doc/05-repositories.md#path भी संभावित रूप से उपयोगी है और मेरे लिए बेहतर काम कर रहा है।
जैस्मीन हेगमैन

@ जैस्मीनहैगमैन! मैंने वह भी इस्तेमाल किया है - विकास के लिए महान
डैनी कोपिंग

इसे एक अच्छा उत्तर देने के लिए, आपको इसे करने के लिए HOW दिखाना चाहिए, न कि केवल फीचर को नाम देना चाहिए और डॉक्स को लिंक करना होगा (हालाँकि यह भी महत्वपूर्ण है)। नीचे दिए गए अन्य उत्तरों के उचित उदाहरण हैं।
रुडोल्फबाइकर

173

एक स्थानीय, में विकास पैकेज के लिए लिंक करने के लिए जिस तरह से अपने मुख्य परियोजना में पहली ऐड करने के लिए है 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में आवश्यकता आदेश है महत्वपूर्ण, संगीतकार इस पिक करने के लिए स्रोत कोड का उपयोग करता है और अपने नए पैकेज के लिए यह सिमलिंक।

यह एक स्थिरता ध्वज है जो संस्करण अवरोध ( पैकेज लिंक देखें ) में जोड़ा गया है ।

ये आपको न्यूनतम स्थिरता सेटिंग के दायरे से परे पैकेज की स्थिरता को आगे बढ़ाने या विस्तारित करने की अनुमति देते हैं ।

न्यूनतम स्थिरता के झंडे हैं:

उपलब्ध विकल्प (स्थिरता के क्रम में) कर रहे हैं dev, alpha, beta, RC, और stable


8
ध्यान दें, कि आपको कंपोजर द्वारा किसी पथ को निर्दिष्ट करने की अनुमति नहीं है जो कि कंपोजर में है। कंपोजर रखा गया है।
MaPePeR

दिलचस्प बात, MaeePeR मैं यह नहीं जानता था। हालाँकि, मुझे लगता है कि सभी वेब फ्रेमवर्क पहले से ही सभी निर्भरताओं को एक "विक्रेता" फ़ोल्डर में रखकर इसका ख्याल रखते हैं? Yii2 ऐसा करता है, कम से कम।
धीरज गुप्ता

3
composer require "vendorname/packagename @dev""require":{ "vendorname/packagename": "@dev" }अपने ऐप के कंपोज़र में अनुवाद करें । यदि आप कंपोज़र इंस्टॉल चलाना चाहते हैं तो
Sir_Faenor

2
कृपया इसे जोड़ें: कंपोजर कॉन्‍फ़िगरेशन रिपॉजिटरी।लोकल पथ / पूर्ण / या / रिश्‍तेदार / पथ / से / विकास / पैकेज रिपॉजिटरी जोड़ने का सही तरीका है
तुलसी

1
क्या कंपोजर को यह कहना संभव है कि वह विक्रेता के फ़ोल्डर में इसे सिमलिंक बनाने के बजाय इंस्टाल के लिए स्थापित करे?
बेंजामिन

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-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
"आरएम-आरएफ विक्रेता / कंपनी / पैकेज" महत्वपूर्ण है
एलेक्स 83690

@ Alex83690 केवल अगर आप पहले से ही composer updateसमान के साथ भाग चुके हैं composer.jsonऔर इसलिए आपको संगीतकार द्वारा बनाए गए पिछले सिमलिंक को हटाने की आवश्यकता है
Whyer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.