Gunakan komposer PHP untuk mengkloning git repo

111

Saya mencoba menggunakan komposer untuk secara otomatis mengkloning repositori git dari github yang tidak ada di pembuat paket tetapi tidak berfungsi dan saya tidak tahu apa yang saya lakukan salah.

Saya rasa saya harus memasukkannya ke dalam "repositori" seperti:

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

dan kemudian mungkin mencantumkannya di bagian "memerlukan". Ini harus serupa dengan contoh ini tetapi tidak berhasil. Itu hanya memberikan kesalahan ini:

Persyaratan Anda tidak dapat diselesaikan menjadi sekumpulan paket yang dapat diinstal.

Adakah yang pernah mencoba melakukan hal seperti ini?

martin
sumber

Jawaban:

110

Pada saat penulisan tahun 2013, ini adalah salah satu cara untuk melakukannya. Komposer telah menambahkan dukungan untuk cara yang lebih baik: Lihat jawaban @igorw

APAKAH ANDA MEMILIKI REPOSITORI?

Git, Mercurial dan SVN didukung oleh Composer.

APAKAH ANDA PUNYA AKSES TULIS KE REPOSITORI?

Iya?

APAKAH REPOSITORI MEMILIKI composer.jsonFILE

Jika Anda memiliki repositori, Anda dapat menulis ke: Tambahkan composer.jsonfile, atau perbaiki yang sudah ada, dan JANGAN gunakan solusi di bawah ini.

Buka jawaban @igorw

HANYA GUNAKAN INI JIKA ANDA TIDAK MEMILIKI REPOSITORI
ATAU JIKA REPOSITORI TIDAK MEMILIKI composer.jsonDAN ANDA TIDAK DAPAT MENAMBAHNYA

Ini akan menimpa segala sesuatu yang mungkin bisa dibaca oleh Komposer dari repositori asli composer.json, termasuk dependensi paket dan pemuatan otomatis.

Menggunakan packagetipe akan mentransfer beban untuk mendefinisikan semuanya dengan benar kepada Anda. Cara yang lebih mudah adalah dengan memiliki composer.jsonfile di repositori, dan gunakan saja.

Solusi ini hanya untuk kasus yang jarang terjadi di mana Anda memiliki unduhan ZIP yang tidak dapat diubah, atau repositori yang hanya dapat Anda baca, tetapi tidak dipertahankan lagi.

"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"
}
Mike Graf
sumber
7
Mengganti repositori VCS dengan repositori paket adalah ide yang buruk. Repo target sudah memiliki composer.json, jadi gunakan repo vcs. Contoh Anda juga merusak pemuatan otomatis dan mengabaikan branch-alias.
igorw
1
@igorw dapatkah Anda menautkan ke informasi itu sehingga saya dan yang lain dapat memahami perbedaannya? Terima kasih.
Mike Graf
5
Seperti yang dijelaskan di halaman repositori, repo paket harus menyertakan semua informasi. Jika Anda tidak menambahkan autoloadbidang, itu tidak akan disertakan. Pada dasarnya Anda perlu menyalin-tempel semua info dari composer.jsonke definisi repo. Repo VCS mengambil info itu dari VCS secara langsung. Manfaat branch-aliasdijelaskan di dokumen alias dan posting blog yang saya tulis .
igorw
2
Mengapa ini masih dipilih? Dokumen komposer bahkan secara eksplisit menyatakan bahwa repo paket harus dihindari. Tolong, berhentilah mendorong praktik buruk.
igorw
1
Apa yang Anda rekomendasikan agar saya mengubahnya?
Mike Graf
146

Paket tersebut sebenarnya tersedia melalui packagist . Anda tidak memerlukan definisi repositori khusus dalam kasus ini. Pastikan Anda menambahkan require(yang selalu diperlukan) dengan batasan versi yang cocok.

Secara umum, jika sebuah paket tersedia di pembuat paket, jangan tambahkan repo VCS. Itu hanya akan memperlambat segalanya.


Untuk paket yang tidak tersedia melalui packagist, gunakan repositori VCS (atau git), seperti yang ditunjukkan dalam pertanyaan Anda. Saat Anda melakukannya, pastikan bahwa:

  • Bidang "repositories" ditentukan di root composer.json (ini adalah bidang khusus root, definisi repositori dari paket yang diperlukan diabaikan)
  • Definisi repositori menunjuk ke repo VCS yang valid
  • Jika jenisnya adalah "git" dan bukan "vcs" (seperti dalam pertanyaan Anda), pastikan itu memang git repo
  • Anda memiliki requireuntuk paket yang dimaksud
  • Batasan di require cocok dengan versi yang disediakan oleh repo VCS. Anda dapat menggunakan composer show <packagename>untuk menemukan versi yang tersedia. Dalam hal ini ~2.3akan menjadi pilihan yang baik.
  • Nama di require cocok dengan nama di remote composer.json. Dalam hal ini, memang demikian gedmo/doctrine-extensions.

Ini contohnya composer.json yang menginstal paket yang sama melalui repo VCS:

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

Itu repo VCS menjelaskan semua ini dengan cukup baik.


Jika ada repositori git (atau VCS lain) dengan yang composer.jsontersedia, jangan gunakan repo "paket". Repo paket mengharuskan Anda untuk memberikan semua metadata dalam definisi dan akan sepenuhnya mengabaikan semua yang composer.jsonada di dist dan sumber yang disediakan. Mereka juga memiliki batasan tambahan, seperti tidak mengizinkan pembaruan yang tepat dalam banyak kasus.

Hindari repo paket ( lihat juga dokumen ).

igorw
sumber
1
Ouu, terima kasih! Saya tidak menemukannya karena saya pikir itu akan dipanggil setelah DoctrineExtensions git repo.
martin
2
Selalu lihat nama yang diberikan composer.json.
igorw
16
-1 Mengapa ini ditandai sebagai jawaban yang benar? Itu benar-benar menyelesaikan masalah OP tetapi Clarence dan Mike Graf memberikan jawaban untuk masalah yang lebih umum di baliknya. Sangat tidak mungkin bahwa siapa pun yang mencari cara untuk memasukkan proyek non-paket ingin menyertakan DoctrineExtensions.
aefxx
2
@aefxx Jawaban saya tidak sebenarnya juga menjelaskan masalah umum umum, yang adalah bahwa requirebidang harus ditentukan.
igorw
6
The VCS repo docs explain all of this quite well.... apa?
hek2mgl
47

Anda dapat menyertakan repositori git ke composer.json seperti ini:

"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"
}
Edris
sumber
1
Seperti yang dijelaskan dalam jawaban lain di atas: Jika Anda memiliki repositori, tambahkan composer.jsonfile jika memungkinkan.
Sven
@ Sven ... karena tidak mungkin untuk menentukan komit tertentu sebaliknya?
Cees Timmerman
Terima kasih telah berbagi, menyelamatkan saya berjam-jam :)
metamaker
Ini disesuaikan menjadi umum, tetapi sebaliknya pada dasarnya salinan biasa dari jawaban Mike Graf, jadi saya tidak yakin apakah umum lebih baik daripada melihat perpustakaan tertentu dalam pertanyaan sebagai contoh.
FantomX1
6

Beri tahu komposer untuk menggunakan sumber jika tersedia:

composer update --prefer-source

Atau:

composer install --prefer-source

Kemudian Anda akan mendapatkan paket sebagai repositori kloning daripada tarbal yang diekstrak, sehingga Anda dapat membuat beberapa perubahan dan mengkomitnya kembali. Tentu saja, dengan asumsi Anda memiliki izin tulis / push ke repositori dan Komposer tahu tentang repositori proyek.

Penafian: Saya pikir saya dapat menjawab pertanyaan yang sedikit berbeda, tetapi inilah yang saya cari ketika saya menemukan pertanyaan ini, jadi saya harap ini akan bermanfaat bagi orang lain juga.

Jika Composer tidak tahu, di mana repositori proyek, atau proyek tidak memiliki composer.json yang tepat, situasinya sedikit lebih rumit, tetapi skenario lain telah menjawab seperti itu.

Josef Kufner
sumber
3

Saya mengalami kesalahan berikut: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

Jika Anda membagi repo lain untuk membuat perubahan Anda sendiri, Anda akan mendapatkan repositori baru.

Misalnya:

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

Url baru harus masuk ke bagian repositori composer.json Anda.

Ingat jika Anda ingin merujuk ke garpu Anda seperti my-foo/bardi bagian yang Anda butuhkan, Anda harus mengganti nama paket di composer.jsonfile di dalam repo baru Anda.

{
    "name":         "foo/bar",

=>

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

Jika Anda baru saja bercabang, cara termudah untuk melakukannya adalah mengeditnya langsung di dalam github.

Henry
sumber
Perhatikan bahwa nama paket sama sekali tidak mencerminkan URL dari mana Anda dapat membaca repositori! Tidak ada hubungan otomatis antara keduanya, keduanya dapat dipilih secara mandiri. Satu-satunya informasi yang relevan mengenai Komposer adalah nama yang tertulis di nameatribut di dalamnya composer.json.
Sven
2

Dalam kasus saya, saya menggunakan Symfony2.3.x dan parameter stabilitas minimum secara default adalah "stabil" (yang bagus). Saya ingin mengimpor repo bukan dalam paket tetapi memiliki masalah yang sama "Persyaratan Anda tidak dapat diselesaikan ke satu set paket yang dapat diinstal.". Ternyata composer.json di repo yang saya coba impor menggunakan minimum-stability "dev".

Jadi untuk mengatasi masalah ini, jangan lupa untuk memverifikasi minimum-stability. Saya menyelesaikannya dengan meminta dev-masterversi, bukan masterseperti yang dinyatakan dalam posting ini .

Tukang sihir
sumber
4
Saya memiliki masalah yang sama, yang dibahas di sini . Jika Anda memiliki ref eksplisit (seperti git commit), tampaknya Anda dapat melakukan sesuatu seperti "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e".
Blaskovicz
1

Jika Anda ingin menggunakan a composer.jsondari GitHub, Anda akan melihat contoh ini (di bawah bagian VCS).

Bagian paket adalah untuk paket yang tidak memiliki ekstensi composer.json. Namun, Anda tidak mengikuti contoh itu juga atau itu juga akan berhasil. Bacalah apa yang dikatakan tentang repositori paket:

Pada dasarnya, Anda mendefinisikan informasi yang sama yang disertakan dalam repositori komposer packages.json, tetapi hanya untuk satu paket. Sekali lagi, bidang wajib minimum adalah nama, versi, dan salah satu dari dist atau sumber.

Clarence
sumber
0

Saya mencoba untuk bergabung dengan solusi yang disebutkan di sini karena ada beberapa poin penting yang perlu dicantumkan.

  1. Seperti yang disebutkan dalam jawaban @ igorw, URL ke repositori harus ditentukan dalam file composer.json, namun karena dalam kedua kasus, composer.json harus ada (tidak seperti cara ke-2 @Mike Graf) yang menerbitkannya di Packagist adalah tidak jauh berbeda (lebih jauh lagi, Github saat ini menyediakan layanan paket sebagai paket npm), hanya perbedaannya daripada memasukkan URL secara harfiah pada antarmuka paket setelah mendaftar.

  2. Selain itu, ia memiliki kekurangan yaitu tidak dapat mengandalkan pustaka eksternal yang menggunakan pendekatan ini karena definisi repositori rekursif tidak berfungsi di Komposer. Lebih jauh lagi, karena itu, tampaknya ada "bug" di atasnya, karena definisi rekursif gagal pada dependensi, menentukan repositori secara eksplisit di root tampaknya tidak cukup tetapi juga semua dependensi dari paket harus dihormati.

Dengan file komposer (dijawab pada 18 Oktober '12 jam 15:13 igorw)

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

Tanpa file komposer (dijawab 23 Januari '13 pukul 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"
}
FantomX1
sumber