ใช้ PHP composer เพื่อโคลน git repo


112

ฉันพยายามใช้นักแต่งเพลงเพื่อโคลนที่เก็บ git โดยอัตโนมัติจาก github ที่ไม่ได้อยู่ในแพ็กเกจแต่มันใช้ไม่ได้และฉันคิดไม่ออกว่าฉันทำอะไรผิด

ฉันคิดว่าฉันต้องรวมไว้ใน "ที่เก็บ" ดังนี้:

"repositories": [
    {
        "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
        "type": "git"
    }
],

จากนั้นอาจระบุไว้ในส่วน "ต้องใช้" ควรจะคล้ายกับตัวอย่างนี้แต่ไม่ได้ผล มันให้ข้อผิดพลาดนี้:

ความต้องการของคุณไม่สามารถแก้ไขเป็นชุดแพ็คเกจที่ติดตั้งได้

มีใครลองทำอะไรแบบนี้บ้างแล้ว?

คำตอบ:


110

ตอนที่เขียนปี 2013 นี่เป็นวิธีหนึ่งที่ทำได้ นักแต่งเพลงได้เพิ่มการสนับสนุนสำหรับวิธีที่ดีกว่า: ดูคำตอบของ @igorw

คุณมี REPOSITORY หรือไม่?

Git, Mercurial และ SVN รองรับโดย Composer

คุณได้เขียนการเข้าถึง REPOSITORY หรือไม่?

ใช่?

REPOSITORY มีcomposer.jsonไฟล์หรือไม่

หากคุณมีที่เก็บคุณสามารถเขียนถึง: เพิ่มcomposer.jsonไฟล์หรือแก้ไขไฟล์ที่มีอยู่และอย่าใช้วิธีแก้ปัญหาด้านล่าง

ไปที่คำตอบของ @igorw

ใช้สิ่งนี้เฉพาะในกรณีที่คุณไม่มี REPOSITORY
หรือหาก REPOSITORY ไม่มีcomposer.jsonและคุณไม่สามารถเพิ่มได้

สิ่งนี้จะแทนที่ทุกสิ่งที่นักแต่งเพลงอาจสามารถอ่านได้จากที่เก็บดั้งเดิมcomposer.jsonรวมถึงการอ้างอิงของแพ็คเกจและการโหลดอัตโนมัติ

การใช้packageประเภทจะโอนภาระในการกำหนดทุกสิ่งอย่างถูกต้องมาสู่คุณ วิธีที่ง่ายกว่าคือการมีcomposer.jsonไฟล์ในที่เก็บและใช้มัน

โซลูชันนี้มีไว้สำหรับกรณีที่หายากเท่านั้นที่คุณมีการดาวน์โหลด ZIP ที่ถูกละทิ้งซึ่งคุณไม่สามารถแก้ไขได้หรือพื้นที่เก็บข้อมูลที่คุณสามารถอ่านได้เท่านั้น แต่จะไม่ได้รับการดูแลอีกต่อไป

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}

7
การแทนที่ที่เก็บ VCS ด้วยที่เก็บแพ็กเกจเป็นความคิดที่ไม่ดี repo เป้าหมายมี a อยู่แล้วcomposer.jsonดังนั้นให้ใช้ vcs repo ตัวอย่างของคุณยังหยุดการโหลดอัตโนมัติและละเว้นไฟล์branch-alias.
igorw

1
@igorw คุณช่วยลิงค์ไปยังข้อมูลเพื่อให้ฉันและคนอื่นเข้าใจความแตกต่างได้ไหม ขอบคุณ.
Mike Graf

5
ตามที่อธิบายไว้ในหน้าที่เก็บที่เก็บแพ็กเกจจะต้องมีข้อมูลทั้งหมด หากคุณไม่เพิ่มautoloadเขตข้อมูลจะไม่ถูกรวมไว้ โดยทั่วไปคุณต้องคัดลอกและวางข้อมูลทั้งหมดจากcomposer.jsonไปยังข้อกำหนด repo VCS repo จะดึงข้อมูลนั้นจาก VCS โดยตรง ประโยชน์ของการbranch-aliasมีการอธิบายในนามแฝง docและโพสต์บล็อกที่ผมเขียน
igorw

2
เหตุใดจึงยังคงมีการโหวตเพิ่มขึ้น เอกสารของผู้แต่งยังระบุอย่างชัดเจนว่าควรหลีกเลี่ยงแพ็กเกจ repos โปรดหยุดสนับสนุนการปฏิบัติที่ไม่ดี
igorw

1
คุณแนะนำให้เปลี่ยนเป็นอะไร
Mike Graf

147

แพคเกจในความเป็นจริงที่สามารถใช้ได้ผ่าน packagist คุณไม่จำเป็นต้องมีนิยามที่เก็บแบบกำหนดเองในกรณีนี้ ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มrequire(ซึ่งจำเป็นเสมอ) ด้วยข้อ จำกัด ของเวอร์ชันที่ตรงกัน

โดยทั่วไปหากมีแพ็กเกจบน packagist อย่าเพิ่ม VCS repo มันจะทำให้สิ่งต่างๆช้าลง


สำหรับแพ็กเกจที่ไม่มีให้ใช้งานผ่าน packagist ให้ใช้ที่เก็บVCS (หรือ git) ดังที่แสดงในคำถามของคุณ เมื่อคุณดำเนินการตรวจสอบให้แน่ใจว่า:

  • ฟิลด์ "ที่เก็บ" ถูกระบุไว้ใน root composer.json (เป็นฟิลด์รูทเท่านั้นคำจำกัดความที่เก็บจากแพ็กเกจที่ต้องการจะถูกละเว้น)
  • นิยามที่เก็บชี้ไปที่ที่เก็บ VCS ที่ถูกต้อง
  • หากประเภทเป็น "git" แทนที่จะเป็น "vcs" (ตามคำถามของคุณ) ตรวจสอบให้แน่ใจว่าเป็น git repo
  • คุณมีrequireสำหรับแพ็คเกจที่เป็นปัญหา
  • ข้อ จำกัด ในการrequireแข่งขันตรงกับเวอร์ชันที่จัดทำโดย VCS repo คุณสามารถใช้composer show <packagename>เพื่อค้นหาเวอร์ชันที่มี ในกรณีนี้~2.3จะเป็นตัวเลือกที่ดี
  • ชื่อในตรงกับชื่อที่อยู่ในระยะไกลrequire ในกรณีนี้ก็คือcomposer.jsongedmo/doctrine-extensions

นี่คือตัวอย่างcomposer.jsonที่ติดตั้งแพคเกจเดียวกันผ่าน VCS repo:

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

เอกสาร VCS repoอธิบายทั้งหมดนี้ค่อนข้างดี


หากมีที่เก็บ git (หรือ VCS อื่น) พร้อมใช้composer.jsonงานอย่าใช้ repo "package" แพคเกจ Repos คุณต้องให้ทั้งหมดของเมตาดาต้าในความหมายและจะสมบูรณ์ไม่สนใจใด ๆcomposer.jsonอยู่ในอ. ที่ให้บริการและแหล่งที่มา นอกจากนี้ยังมีข้อ จำกัด เพิ่มเติมเช่นไม่อนุญาตให้อัปเดตที่เหมาะสมในกรณีส่วนใหญ่

หลีกเลี่ยงแพ็กเกจ repos ( ดูเอกสารประกอบ )


1
Ouu ขอบคุณ! ฉันไม่พบมันเพราะฉันคิดว่ามันจะถูกเรียกหลังจาก git repo DoctrineExtensions
martin

2
ดูชื่อที่ให้ไว้composer.jsonเสมอ
igorw

16
-1 เหตุใดจึงถูกทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง แน่นอนว่าช่วยแก้ปัญหาของ OP ได้ แต่ Clarence และ Mike Graf ให้คำตอบสำหรับปัญหาทั่วไปที่อยู่เบื้องหลัง ไม่น่าเป็นไปได้อย่างยิ่งที่ใครก็ตามที่ค้นหาวิธีรวมโครงการที่ไม่ใช่แพ็กเกจจะต้องการรวม DoctrineExtensions
aefxx

2
@aefxx คำตอบของฉันไม่ในความเป็นจริงยังอธิบายปัญหาทั่วไปทั่วไปซึ่งเป็นว่าrequireข้อมูลจะต้องระบุ
igorw

6
The VCS repo docs explain all of this quite well.... อะไร?
hek2mgl

47

คุณสามารถรวมที่เก็บ git เข้ากับ composer.json ดังนี้:

"repositories": [
{
    "type": "package",
    "package": {
        "name": "example-package-name", //give package name to anything, must be unique
        "version": "1.0",
        "source": {
            "url": "https://github.com/example-package-name.git", //git url
            "type": "git",
            "reference": "master" //git branch-name
        }
    }
}],
"require" : {
  "example-package-name": "1.0"
}

1
ตามที่อธิบายไว้ในคำตอบอื่น ๆ ข้างต้น: หากคุณมีที่เก็บให้เพิ่มcomposer.jsonไฟล์หากทำได้ทั้งหมด
Sven

@Sven ... เพราะมันเป็นไปไม่ได้ที่จะระบุการกระทำเฉพาะเป็นอย่างอื่น?
Cees Timmerman

ขอบคุณสำหรับการแบ่งปันช่วยฉันได้หลายชั่วโมง :)
metamaker

สิ่งนี้ถูกปรับให้เป็นแบบทั่วไป แต่โดยทั่วไปแล้วจะเป็นสำเนาธรรมดาของคำตอบของ Mike Graf ดังนั้นฉันไม่แน่ใจว่าทั่วไปดีกว่าการดูไลบรารีเฉพาะในคำถามเป็นตัวอย่างหรือไม่
FantomX1

6

เพียงบอกผู้แต่งให้ใช้แหล่งที่มาหากมี:

composer update --prefer-source

หรือ:

composer install --prefer-source

จากนั้นคุณจะได้รับแพ็กเกจเป็นที่เก็บโคลนแทนที่จะเป็นทาร์บอลที่แยกออกมาดังนั้นคุณสามารถทำการเปลี่ยนแปลงและส่งกลับได้ แน่นอนว่าสมมติว่าคุณมีสิทธิ์เขียน / พุชไปยังที่เก็บและนักแต่งเพลงรู้เกี่ยวกับที่เก็บของโปรเจ็กต์

คำเตือน: ฉันคิดว่าฉันอาจจะตอบคำถามที่แตกต่างไปเล็กน้อย แต่นี่คือสิ่งที่ฉันกำลังมองหาเมื่อฉันพบคำถามนี้ดังนั้นฉันหวังว่ามันจะเป็นประโยชน์กับคนอื่น ๆ เช่นกัน

หาก Composer ไม่ทราบว่าที่เก็บของโปรเจ็กต์อยู่ที่ไหนหรือโปรเจ็กต์ไม่มี composer.json ที่เหมาะสมสถานการณ์จะซับซ้อนกว่าเล็กน้อย แต่คนอื่น ๆ ก็ตอบสถานการณ์ดังกล่าวแล้ว


3

ฉันพบข้อผิดพลาดต่อไปนี้: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

หากคุณกำลังบังคับให้ที่เก็บอื่นทำการเปลี่ยนแปลงของคุณเองคุณจะได้พื้นที่เก็บข้อมูลใหม่

เช่น:

https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git

URL ใหม่จะต้องเข้าไปในส่วนที่เก็บของ composer.json ของคุณ

จำไว้ว่าหากคุณต้องการอ้างถึงส้อมของคุณmy-foo/barในส่วนที่คุณต้องการคุณจะต้องเปลี่ยนชื่อแพ็กเกจในcomposer.jsonไฟล์ภายใน repo ใหม่ของคุณ

{
    "name":         "foo/bar",

=>

{
    "name":         "my-foo/bar",

หากคุณเพิ่งแยกวิธีที่ง่ายที่สุดคือแก้ไขภายใน github


โปรดทราบว่าชื่อแพ็กเกจไม่ได้สะท้อนถึง URL ที่คุณสามารถอ่านที่เก็บได้! ไม่มีการเชื่อมโยงอัตโนมัติระหว่างสองทั้งสองอย่างสามารถเลือกได้อย่างอิสระ ข้อมูลที่เกี่ยวข้องเพียงเกี่ยวกับการแต่งเพลงที่เป็นชื่อที่เขียนลงในภายในแอตทริบิวต์name composer.json
Sven

2

ในกรณีของฉันฉันใช้ Symfony2.3.x และพารามิเตอร์ความเสถียรขั้นต่ำโดยค่าเริ่มต้นคือ "เสถียร" (ซึ่งเป็นสิ่งที่ดี) ฉันต้องการนำเข้า repo ที่ไม่ได้อยู่ใน packagist แต่มีปัญหาเดียวกัน "ข้อกำหนดของคุณไม่สามารถแก้ไขเป็นชุดแพ็กเกจที่ติดตั้งได้" ดูเหมือนว่า composer.json ใน repo ที่ฉันพยายามนำเข้าใช้ "dev" ที่มีความเสถียรต่ำสุด

ดังนั้นในการแก้ไขปัญหานี้อย่าลืมตรวจสอบไฟล์minimum-stability. ฉันแก้ไขโดยต้องใช้dev-masterเวอร์ชันแทนmasterตามที่ระบุไว้ในโพสต์นี้


4
ผมมีปัญหาเดียวกันซึ่งจะกล่าวถึงที่นี่ หากคุณมีการอ้างอิงที่ชัดเจน (เช่นคอมมิตคอมไพล์) ดูเหมือนว่าคุณสามารถทำสิ่งที่ต้องการ"dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e"ได้
Blaskovicz

1

หากคุณต้องการใช้ a composer.jsonจาก GitHub คุณจะต้องดูตัวอย่างนี้ (ในส่วน VCS)

ส่วนแพ็คเกจมีไว้สำหรับแพ็คเกจที่ไม่มีส่วนcomposer.json. อย่างไรก็ตามคุณไม่ได้ทำตามตัวอย่างนั้นเช่นกันมิฉะนั้นจะได้ผลเช่นกัน อ่านสิ่งที่กล่าวเกี่ยวกับที่เก็บแพ็คเกจ:

โดยทั่วไปคุณกำหนดข้อมูลเดียวกันกับที่รวมอยู่ในที่เก็บของผู้แต่งpackages.jsonแต่สำหรับแพ็คเกจเดียวเท่านั้น อีกครั้งฟิลด์ที่จำเป็นขั้นต่ำคือชื่อเวอร์ชันและของ dist หรือ source


0

ฉันพยายามเข้าร่วมโซลูชันที่กล่าวถึงที่นี่เนื่องจากมีประเด็นสำคัญบางประการที่จำเป็นในรายการ

  1. ตามที่กล่าวไว้ในคำตอบของ @ igorw URL ไปยังที่เก็บจะต้องอยู่ในกรณีนั้นที่ระบุไว้ในไฟล์ composer.json อย่างไรก็ตามในทั้งสองกรณีจะต้องมี composer.json (ไม่เหมือนทางที่ 2 @Mike Graf) การเผยแพร่บน Packagist คือ ไม่แตกต่างกันมากนัก (นอกจากนี้ Github ยังให้บริการแพ็คเกจเป็นแพ็คเกจ npm) ความแตกต่างเพียงอย่างเดียวแทนที่จะป้อน URL ที่อินเทอร์เฟซ packagist เมื่อลงชื่อสมัครใช้

  2. นอกจากนี้ยังมีข้อบกพร่องที่ไม่สามารถพึ่งพาไลบรารีภายนอกที่ใช้แนวทางนี้เนื่องจากนิยามที่เก็บแบบเรียกซ้ำไม่ทำงานใน Composer นอกจากนี้เนื่องจากดูเหมือนว่าจะมี "จุดบกพร่อง" อยู่เนื่องจากคำจำกัดความแบบเรียกซ้ำล้มเหลวในการอ้างอิงการตอบกลับที่เก็บอย่างชัดเจนในรูทดูเหมือนจะไม่เพียงพอ แต่ยังรวมถึงการอ้างอิงทั้งหมดจากแพ็คเกจด้วย ได้รับการตอบสนอง

พร้อมไฟล์ผู้แต่ง(ตอบ 18 ต.ค. 55 เวลา 15:13 น. igorw)

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

ไม่มีไฟล์ผู้แต่ง(ตอบเมื่อ 23 ม.ค. 56 เวลา 17:28 น. Mike Graf)

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.