Git deposunu klonlamak için PHP oluşturucuyu kullanın


112

Packagist'te olmayan bir git deposunu github'dan otomatik olarak klonlamak için composer'ı kullanmaya çalışıyorum, ancak çalışmıyor ve neyi yanlış yaptığımı anlayamıyorum .

Sanırım bunu şu şekilde "havuzlar" arasına eklemem gerekiyor:

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

ve sonra muhtemelen "gerekli" bölümünde listeleyin. Bu örneğe benzer olmalı ama çalışmıyor. Sadece şu hatayı veriyor:

Gereksinimleriniz, kurulabilir bir paket grubuna çözümlenemedi.

Hiç kimse böyle bir şey yapmaya çalıştı mı?

Yanıtlar:


110

2013'te yazı yazarken, bunu yapmanın bir yolu buydu. Besteci iyi yollar desteği ekledi: See @igorw 'ın cevabı

BİR DEPOSUNUZ VAR MI?

Git, Mercurial ve SVN, Composer tarafından desteklenmektedir.

DEPOYA YAZILI ERİŞİMİNİZ VAR MI?

Evet?

DEPOSU'NUN composer.jsonDOSYASI VAR MI

Bir deponuz varsa, yazabilirsiniz: Bir composer.jsondosya ekleyin veya mevcut olanı düzeltin ve aşağıdaki çözümü KULLANMAYIN.

'Nin @igorw git cevabı

SADECE KULLANIM BU yapmamanız gereken bir DEPOSU
YA EĞER DEPOSU etmez VAR A composer.jsonVE ONU ADD CAN NOT

Bu composer.json, paketin bağımlılıkları ve otomatik yükleme dahil, Composer'ın orijinal depodan okuyabileceği her şeyi geçersiz kılar .

packageTürü kullanmak, her şeyi doğru bir şekilde tanımlama yükünü size aktaracaktır. Daha kolay yol, composer.jsonarşivde bir dosyaya sahip olmak ve onu kullanmaktır.

Bu çözüm gerçekten yalnızca, değiştiremeyeceğiniz terk edilmiş bir ZIP indirmenizin veya yalnızca okuyabileceğiniz ancak artık korunmayan bir deponun olduğu nadir durumlar içindir.

"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 havuzunu bir paket deposu ile değiştirmek kötü bir fikirdir. Hedef depoda zaten composer.jsonbir vcs deposu var, bu nedenle bir vcs deposu kullanın. Örneğiniz ayrıca otomatik yüklemeyi bozar ve branch-alias.
igorw

1
@igorw, benim ve diğerlerinin farkı anlayabilmesi için bu bilgilere bağlantı verebilir misiniz? Teşekkürler.
Mike Graf

5
Depolar sayfasında açıklandığı gibi, bir paket deposu tüm bilgileri içermelidir. autoloadAlanı eklemezseniz, dahil edilmeyecektir. Temel olarak, tüm bilgileri composer.jsondepodan repo tanımına kopyalayıp yapıştırmanız gerekir . VCS deposu bu bilgiyi doğrudan VCS'den alır. Faydaları branch-aliasaçıklanmıştır adlar doc ve yazdığım bir blog yazısı .
igorw

2
Buna neden hala olumlu oy veriliyor? Besteci dokümanları , paket depolarından kaçınılması gerektiğini açıkça belirtir. Lütfen kötü uygulamaları teşvik etmeyi bırakın.
igorw

1
O zaman ne yapmamı önerirsin?
Mike Graf

146

Bu paket aslında paketçi aracılığıyla edinilebilir . Bu durumda özel bir depo tanımına ihtiyacınız yoktur. Sadece requireeşleşen bir sürüm kısıtlaması olan bir (her zaman gereklidir) eklediğinizden emin olun .

Genel olarak, bir paket packagist üzerinde mevcut ise, yok bir VCS repo ekleyin. Sadece işleri yavaşlatacak.


Packagist aracılığıyla kullanılamayan paketler için sorunuzda gösterildiği gibi bir VCS (veya git) deposu kullanın . Bunu yaptığınızda şunlardan emin olun:

  • "Depolar" alanı, kök composer.json'da belirtilir (bu yalnızca kök bir alandır, gerekli paketlerdeki depo tanımları göz ardı edilir)
  • Depo tanımı geçerli bir VCS deposunu işaret ediyor
  • Tür, "vcs" yerine "git" ise (sorunuzda olduğu gibi), aslında bir git deposu olduğundan emin olun
  • Söz requirekonusu paket için bir var
  • Kısıtlama require, VCS deposu tarafından sağlanan sürümlerle eşleşir. Sen kullanabilirsiniz composer show <packagename>mevcut sürümlerini bulmak için. Bu durumda ~2.3iyi bir seçenek olacaktır.
  • Ad requirekumandasına adıyla eşleşen composer.json. Bu durumda, öyle gedmo/doctrine-extensions.

İşte composer.jsonaynı paketi bir VCS deposu aracılığıyla yükleyen bir örnek :

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

VCS Repo dokümanlar tüm bu oldukça iyi açıklar.


Bir bir budala (ya da diğer VCS) depo varsa composer.jsonmevcuttur, yok bir "paket" repo kullanın. Paket repo vermenizi gerektiren tüm tanımında meta olacak ve tamamen görmezden herhangi composer.jsonsağlanan dist ve kaynağında mevcut. Çoğu durumda uygun güncellemelere izin vermemek gibi ek sınırlamaları da vardır.

Paket depolarından kaçının ( ayrıca belgelere bakın ).


1
Ouu, teşekkürler! Bulamadım çünkü git repo DoctrineExtensions'tan sonra çağrılacağını düşündüm.
martin

2
Daima verilen isme bakın composer.json.
igorw

16
-1 Bu neden doğru cevap olarak işaretlendi? Kesinlikle OP'nin sorununu çözdü, ancak Clarence ve Mike Graf arkasındaki daha genel soruna cevaplar verdi. Paketçi olmayan projeleri dahil etmenin bir yolunu arayan herhangi birinin Doktrine Uzantıları dahil etmek istemesi pek olası değildir.
aefxx

2
@aefxx Benim cevabım yok aslında Ayrıca genel genel sorunu açıklamak requirealan belirtilmelidir.
igorw

6
The VCS repo docs explain all of this quite well.... ne?
hek2mgl

47

Git repository'yi composer.json'a şu şekilde dahil edebilirsiniz:

"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
Yukarıdaki diğer cevaplarda açıklandığı gibi: Eğer bir deponuz composer.jsonvarsa, mümkünse bir dosya ekleyin .
Sven

@Sven ... aksi takdirde belirli bir commit belirtmek imkansız olduğu için?
Cees Timmerman

Paylaşım için teşekkürler, saatlerimi :) kurtardı
metamaker

Bu genel olacak şekilde ayarlanmıştır, ancak aksi takdirde temelde Mike Graf'ın cevabının düz bir kopyasıdır, bu nedenle generalin sorudaki belirli bir kütüphaneyi örnek olarak görmekten daha iyi olup olmadığından emin değilim.
FantomX1

6

Besteciye varsa kaynağı kullanmasını söylemeniz yeterli:

composer update --prefer-source

Veya:

composer install --prefer-source

Daha sonra paketleri çıkartılmış tarball'lar yerine klonlanmış depolar olarak alırsınız, böylece bazı değişiklikler yapabilir ve bunları geri verebilirsiniz. Elbette, arşive yazma / itme izinlerine sahip olduğunuzu ve Composer'ın projenin deposu hakkında bilgi sahibi olduğunu varsayarsak.

Sorumluluk reddi: Sanırım biraz farklı bir soruyu yanıtlayabilirim, ancak bu soruyu bulduğumda aradığım şey buydu, bu yüzden başkaları için de faydalı olacağını umuyorum.

Composer, projenin deposunun nerede olduğunu bilmiyorsa veya projede uygun composer.json yoksa, durum biraz daha karmaşıktır, ancak diğerleri bu tür senaryoları zaten yanıtlamıştır.


3

Şu hatayla karşılaşıyordum: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

Kendi değişikliklerinizi yapmak için başka bir depoyu çatallıyorsanız, yeni bir depo elde edersiniz.

Örneğin:

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

Yeni url'nin composer.json dosyanızın depolarınız bölümüne gitmesi gerekecek.

Fork'unuza my-foo/barihtiyaç bölümünüzdeki gibi başvurmak istiyorsanız composer.json, yeni deponuzun içindeki dosyadaki paketi yeniden adlandırmanız gerekeceğini unutmayın.

{
    "name":         "foo/bar",

=>

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

Eğer çatallandıysanız, bunu yapmanın en kolay yolu, onu doğrudan github içinde düzenlemektir.


Paket adının hiçbir şekilde depoyu okuyabileceğiniz URL'yi yansıtmadığını unutmayın! İkisi arasında otomatik bir bağlantı yoktur, her ikisi de bağımsız olarak seçilebilir. Besteci ile ilgili tek ilgili bilgi, nameiçindeki özniteliğe yazılan isimdir composer.json.
Sven

2

Benim durumumda, Symfony2.3.x kullanıyorum ve minimum kararlılık parametresi varsayılan olarak "kararlı" dır (bu iyidir). Packagist'te olmayan bir depoyu içe aktarmak istedim ancak aynı sorunu yaşadım "Gereksinimleriniz kurulabilir bir paket setine çözülemedi." İçe aktarmaya çalıştığım depodaki composer.json'un minimum stabilite "dev" kullandığı görüldü.

Bu nedenle, bu sorunu çözmek için minimum-stability. Bu yazıda belirtildiği gibi bir dev-mastersürüm gerektirerek çözdüm .master


4
Burada tartışılan aynı sorunu yaşadım . Açıkça bir referansınız varsa (git commit gibi), buna benzer bir şey yapabilirsiniz "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e".
Blaskovicz

1

composer.jsonGitHub'dan bir kullanmak istiyorsanız, bu örneğe bakarsınız (VCS bölümü altında).

Paket bölümü composer.json,. Ancak, bu örneği de takip etmediniz, yoksa işe yarardı. Paket depoları hakkında söylediklerini okuyun:

Temel olarak, packages.jsonyalnızca tek bir paket için oluşturucu havuzunda bulunan bilgilerin aynısını tanımlarsınız . Yine, gerekli minimum alanlar ad, sürüm ve dağıtım veya kaynaktır.


0

Listelenmesi gereken bazı önemli noktalar olduğu için burada bahsedilen çözümlere katılmaya çalışıyorum.

  1. @ İgorw'un cevabında belirtildiği gibi, arşivin URL'si composer.json dosyasında belirtilen durumda olmalıdır, ancak her iki durumda da composer.json mevcut olmalıdır (@Mike Graf 2. yolun aksine) bunu Packagist'te yayınlar o kadar da farklı değil (ayrıca Github şu anda paket hizmetlerini npm paketleri olarak sağlıyor), yalnızca kayıt olduktan sonra paketçi arayüzüne URL'yi kelimenin tam anlamıyla girmek yerine fark.

  2. Ayrıca, Composer'da yinelemeli depo tanımları çalışmadığından, bu yaklaşımı kullanan harici bir kitaplığa güvenememesi gibi bir kusuru vardır. Dahası, bu nedenle, üzerinde bir "hata" var gibi görünüyor, çünkü özyinelemeli tanım bağımlılıkta başarısız oldu, depoları açıkça kökte yeniden belirtmek yeterli görünmüyor, ancak aynı zamanda paketlerdeki tüm bağımlılıklar da saygı duyulmalıdır.

İle bir besteci dosyasında (15:13 igorw de 18 Ekim '12 cevap)

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

Besteci dosyası olmadan (23 Ocak 2013, 17:28 Mike Graf yanıtlandı)

"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"
}
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.