Użyj kompozytora PHP, aby sklonować repozytorium git


111

Próbuję użyć kompozytora automatycznie clone git repozytorium z github, który nie jest w packagist ale to nie działa i nie mogę dowiedzieć się, co robię źle.

Myślę, że muszę to zaliczyć do „repozytoriów” w następujący sposób:

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

a następnie prawdopodobnie wypisz go w sekcji „wymagaj”. Powinien być podobny do tego przykładu, ale nie działa. Po prostu podaje ten błąd:

Nie można rozwiązać Twoich wymagań w postaci zestawu pakietów do zainstalowania.

Czy ktoś próbował już coś takiego zrobić?

Odpowiedzi:


110

W chwili pisania tego tekstu w 2013 roku był to jeden ze sposobów na zrobienie tego. Kompozytor dodał wsparcie dla lepszych sposobów: See @igorw „s odpowiedź

CZY MASZ REPOZYTORIUM?

Git, Mercurial i SVN są obsługiwane przez Composer.

CZY MASZ DOSTĘP DO REPOZYTORIUM?

Tak?

CZY REPOZYTOR MA JEST composer.jsonPLIK

Jeśli masz repozytorium, możesz pisać do: Dodaj composer.jsonplik lub napraw istniejący i NIE używaj poniższego rozwiązania.

Idź do @igorw „s odpowiedź

UŻYWAJ TYLKO JEŚLI NIE MASZ REPOZYTORIUM
LUB JEŚLI REPOZYTOR NIE MA composer.jsonI NIE MOŻESZ GO DODAĆ

Spowoduje to przesłonięcie wszystkiego, co Composer może odczytać z oryginalnego repozytorium composer.json, w tym zależności pakietu i automatycznego ładowania.

Używanie packagetypu przeniesie ciężar prawidłowego zdefiniowania wszystkiego na Ciebie. Najłatwiejszym sposobem jest posiadaniecomposer.json pliku w repozytorium i po prostu jego użycie.

To rozwiązanie jest naprawdę tylko w rzadkich przypadkach, gdy masz porzucone pobieranie ZIP, którego nie możesz zmienić, lub repozytorium, które możesz tylko czytać, ale nie jest już utrzymywane.

"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
Zastąpienie repozytorium VCS repozytorium pakietów to zły pomysł. Repozytorium docelowe ma już rozszerzenie composer.json, więc użyj repozytorium vcs. Twój przykład również przerywa automatyczne ładowanie i ignoruje branch-alias.
igorw

1
@igorw czy możesz podać link do tych informacji, abyśmy ja i inni mogli zrozumieć różnicę? Dzięki.
Mike Graf

5
Jak wyjaśniono na stronie repozytoriów, repozytorium pakietów musi zawierać wszystkie informacje. Jeśli nie dodasz autoloadpola, nie zostanie ono uwzględnione. Zasadniczo musisz skopiować i wkleić wszystkie informacje z composer.jsondo definicji repozytorium. Repozytorium VCS pobiera te informacje bezpośrednio z VCS. Korzyści z programu branch-aliassą wyjaśnione w dokumencie dotyczącym aliasów i poście na blogu, który napisałem .
igorw

2
Dlaczego nadal się nad tym głosuje? Dokumentacja kompozytora nawet wyraźnie stwierdza, że należy unikać repozytoriów pakietów. Proszę, przestańcie zachęcać do złych praktyk.
igorw

1
Na co więc radzisz to zmienić?
Mike Graf,

146

Ten pakiet jest faktycznie dostępny za pośrednictwem packagist . W tym przypadku nie potrzebujesz niestandardowej definicji repozytorium. Po prostu upewnij się, że dodajesz require(co jest zawsze potrzebne) z dopasowanym ograniczeniem wersji.

Ogólnie, jeśli pakiet jest dostępny na packagist, nie dodawaj repozytorium VCS. To po prostu spowolni.


W przypadku pakietów, które nie są dostępne za pośrednictwem packagist, użyj repozytorium VCS (lub git), jak pokazano w pytaniu. Kiedy to zrobisz, upewnij się, że:

  • Pole „repozytoria” jest określone w katalogu głównym composer.json (jest to pole tylko dla administratora, definicje repozytoriów z wymaganych pakietów są ignorowane)
  • Definicja repozytoriów wskazuje na prawidłowe repozytorium VCS
  • Jeśli typ to „git” zamiast „vcs” (jak w pytaniu), upewnij się, że jest to faktycznie repozytorium git
  • Masz requiredo paczki, o której mowa
  • Ograniczenie w requiredopasowaniach wersji udostępnionych przez repozytorium VCS. Możesz użyć, composer show <packagename>aby znaleźć dostępne wersje. W tym przypadku ~2.3byłaby to dobra opcja.
  • Nazwa w polu requireodpowiada nazwie w pilocie composer.json. W tym przypadku tak jest gedmo/doctrine-extensions.

Oto przykład, composer.jsonktóry instaluje ten sam pakiet za pośrednictwem repozytorium VCS:

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

Dokumentacja repozytorium VCS wyjaśnia to wszystko całkiem dobrze.


Jeśli istnieje repozytorium git (lub innego VCS) z composer.jsondostępnym repozytorium , nie używaj repozytorium „pakietowego”. Repozytoria pakietów wymagają podania wszystkich metadanych w definicji i całkowicie zignorują wszelkie composer.jsonobecne w dostarczonym dyst i źródle. Mają też dodatkowe ograniczenia, takie jak w większości przypadków uniemożliwianie poprawnych aktualizacji.

Unikaj repozytoriów pakietów ( zobacz także dokumentację ).


1
Ouu, dzięki! Nie znalazłem tego, ponieważ myślałem, że zostanie wywołany po repozytorium git DoctrineExtensions.
martin

2
Zawsze patrz na podane imię composer.json.
igorw

16
-1 Dlaczego ta odpowiedź jest oznaczona jako prawidłowa? To z pewnością rozwiązało problem PO, ale Clarence i Mike Grafowie udzielili odpowiedzi na bardziej ogólny problem, który się za tym kryje. Jest bardzo mało prawdopodobne, aby ktokolwiek, kto szuka sposobu na uwzględnienie projektów niebędących pakietami, chciał dołączyć DoctrineExtensions.
aefxx

2
@aefxx Moja odpowiedź robi w rzeczywistości również wyjaśnić ogólny ogólny problem, który jest, że requirepole musi być określona.
igorw

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

47

Możesz dołączyć repozytorium git do pliku composer.json w następujący sposób:

"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
Jak wyjaśniono w innych odpowiedziach powyżej: Jeśli masz repozytorium, dodaj composer.jsonplik, jeśli to w ogóle możliwe.
Sven

@Sven ... ponieważ nie można inaczej określić konkretnego zatwierdzenia?
Cees Timmerman

Dziękuję za udostępnienie, zaoszczędził mi godziny :)
metamaker

Jest to dostosowane do ogólnego, ale poza tym w zasadzie jest to zwykła kopia odpowiedzi Mike'a Grafa, więc nie jestem pewien, czy ogólna jest lepsza niż zobaczenie konkretnej biblioteki w pytaniu jako przykładu.
FantomX1

6

Po prostu powiedz kompozytorowi, aby użył źródła, jeśli jest dostępne:

composer update --prefer-source

Lub:

composer install --prefer-source

Następnie otrzymasz pakiety jako sklonowane repozytoria zamiast wyodrębnionych paczek, więc możesz wprowadzić pewne zmiany i zatwierdzić je z powrotem. Oczywiście zakładając, że masz uprawnienia do zapisu / wypychania w repozytorium, a Composer wie o repozytorium projektu.

Zastrzeżenie: Myślę, że mogę odpowiedzieć na trochę inne pytanie, ale właśnie tego szukałem, kiedy znalazłem to pytanie, więc mam nadzieję, że będzie przydatne również dla innych.

Jeśli Composer nie wie, gdzie jest repozytorium projektu, albo projekt nie ma odpowiedniego pliku composer.json, sytuacja jest nieco bardziej skomplikowana, ale inni odpowiedzieli już na takie scenariusze.


3

Wystąpił następujący błąd: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

Jeśli rozwidlasz kolejne repozytorium, aby wprowadzić własne zmiany, otrzymasz nowe repozytorium.

Na przykład:

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

Nowy adres URL będzie musiał przejść do sekcji repozytoriów w pliku composer.json.

Pamiętaj, że jeśli chcesz odwołać się do forka, tak jak my-foo/barw wymaganej sekcji, będziesz musiał zmienić nazwę pakietu w composer.jsonpliku wewnątrz nowego repozytorium.

{
    "name":         "foo/bar",

=>

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

Jeśli właśnie rozwidliłeś rozwidlenie, najłatwiej to zrobić, edytuj go bezpośrednio na githubie.


Zauważ, że nazwa pakietu w żaden sposób nie odzwierciedla adresu URL, z którego możesz odczytać repozytorium! Nie ma automatycznego połączenia między nimi, oba można wybrać niezależnie. Jedyną istotną informacją dotyczącą Composera jest nazwa wpisana w nameatrybucie wewnątrz composer.json.
Sven

2

W moim przypadku używam Symfony2.3.x i parametr minimum-stabilność jest domyślnie „stabilny” (co jest dobre). Chciałem zaimportować repozytorium nie z listy packagist, ale miałem ten sam problem: „Twoje wymagania nie mogą zostać rozwiązane na zestaw pakietów do zainstalowania”. Okazało się, że plik composer.json w repozytorium, które próbowałem zaimportować, używa „dev” o minimalnej stabilności.

Aby rozwiązać ten problem, nie zapomnij zweryfikować minimum-stability. Rozwiązałem to, wymagając dev-masterwersji zamiast masterokreślonej w tym poście .


4
Miałem ten sam problem, który jest omawiany tutaj . Jeśli masz wyraźne odniesienie (takie jak zatwierdzenie git), wygląda na to, że możesz zrobić coś takiego "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e".
Blaskovicz

1

Jeśli chcesz użyć composer.jsonz GitHub, spójrz na ten przykład (w sekcji VCS).

Sekcja pakietu jest przeznaczona dla pakietów, które nie mają rozszerzenia composer.json. Jednak ty też nie poszedłeś za tym przykładem, bo też by się udało. Przeczytaj, co mówi o repozytoriach pakietów:

Zasadniczo definiujesz te same informacje, które są zawarte w repozytorium kompozytora packages.json, ale tylko dla pojedynczego pakietu. Ponownie, minimalne wymagane pola to nazwa, wersja oraz dist lub source.


0

Staram się dołączyć do wymienionych tutaj rozwiązań, ponieważ jest kilka ważnych punktów, które należy wymienić.

  1. Jak wspomniano w odpowiedzi @ igorw, adres URL do repozytorium musi być w tym przypadku określony w pliku composer.json, jednak w obu przypadkach musi istnieć plik composer.json (w przeciwieństwie do drugiego sposobu @Mike Graf), aby opublikować go w Packagist niewiele się różni (ponadto Github obecnie dostarcza usługi związane z pakietami jako pakiety npm), jedyna różnica zamiast dosłownego wpisywania adresu URL w interfejsie packagist po zarejestrowaniu się.

  2. Ponadto ma wadę polegającą na tym, że nie może polegać na zewnętrznej bibliotece, która używa tego podejścia, ponieważ definicje repozytoriów rekurencyjnych nie działają w programie Composer. Co więcej, z tego powodu wydaje się, że jest w nim "błąd", ponieważ definicja rekurencyjna zawiodła w zależności, ponowne określenie repozytoriów jawnie w katalogu głównym nie wydaje się wystarczające, ale także wszystkie zależności z pakietów musiałyby być uszanowany.

Z plikiem kompozytora (odpowiedź: 18 października 2012 o 15:13 igorw)

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

Bez pliku kompozytora (odpowiedź: 23 stycznia 2013 o 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"
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.