Composer synchronizer: automatická synchronizace souborů při instalaci & odinstalaci balíčku

Machy8
Člen | 59
+
+4
-

Poměrně nedávno vydalo Symfony balíček symfony/flex. Ikdyž to „neumí nic extra“, tak to přeci jen rozmazlí tím, že programátor nemusí soubory kopírovat a vytvářet ručně. Jelikož pracuji v Nette a pro něj nic takového není (nebo o tom alespoň nevím), rozhodl jsem se něco obdobného vytvořit.

Jak to funguje

  • Řekněme, že si budeme chtít nainstalovat Doctrinu a využijeme k tomu balíčky nettrine/orm, nettrine/migrations a contributte/console.
  • U každého balíčku bychom museli vytvářet konfigurační soubor, vytvořit základní nastavení, includovat ho do Nette, přidat binárku pro konzoli atd.
  • Pokud by ale v projektu byl přidán composer-synchronizer/composer-synchronizer, tak se při instalaci zkontroluje, zda-li má balíček konfiguraci pro kopírování a vytváření souborů buď přímo u sebe nebo v repozitáři na Githubu. Pakliže konfigurace existuje, tak se popřípadě stáhne a soubory se automaticky nakopírují do příslušných adresářů.
  • Programátor už pak jen případně konfiguraci upraví a přidá soubor composer-synchronizer.neon vytvořený synchronizerem ve složce app/config do souboru bootstrap.php.
  • Všechno kopírování binárek a konfiguráků tímto odpadá.

Co musím udělat, aby se mi balíčky v projektu synchronizovaly?

  • Mít nainstalovaný synchronizer
  • Mít přidanou sekci v konfiguráku se zvoleným typem projektu (poslední verze nette2 má alias nette)
  • Instalovat balíčky, který obsahují konfiguraci pro zvolený typ projektu a instalovanou verzi balíčku (vždy dvoumístná)
{
  "extra": {
    "composer-synchronizer": {
      "project-type": "nette"
    }
  }
}

Co musím udělat, aby se balíček synchronizoval?

  • Přidat do composer.json souboru konfiguraci s informacemi, co a kam se má kopírovat nebo přidat, pro daný typ projektu.
  • Konfiguraci pro balíčky, které nejsou vaše, je možné umístit do repozitáře na Githubu, odkud se bude stahovat (počet stažení konfigurace z Githubu je omezen na IP adresu podle Github Rate Limit).
{
    "name": "some/package",
    "extra": {
        "composer-synchronizer": {
            "nette2": {
                "resources": {
                    "extension.neon": "%configDir%/somePackage/",
					"webtemp/": "%wwwDir%/webtemp/"
                },
                "gitignore": [
                    "%wwwDir%/webtemp/"
                ],
                "includes": [
                    "somePackage/extension.neon"
                ]
            }
        }
    }
}

Co to zatím umí…

  • Kopírovat soubory i celé adresáře.
  • Přidávat a odebírat parametry z hlavního .gitignore v adresáři projektu.
  • Přidávat a odebírat cesty ke konfiguračním souborům v soboru app/config/composer-synchronizer.neon.
  • Pokud používáte Nette s upravenou adresářovou strukturou, je možné přepsat placeholdery pro cesty a soubory se následně nakopírují správně.

TODO

  • Přemýšlím, jestli při odinstalaci balíčku odebírat nakopírované soubory? Zatím se jen čistí gitignore a odebírají odinstalované závislosti z composer-synchronizer.neon.
  • Hodilo by se vám po instalaci balíčku spouštět příkazy jako chmod či exec?

Budu rád za jakoukoliv připomínku i nápad!

Marek Bartoš
Nette Blogger | 1263
+
0
-

Vůbec bych nepoužíval ten repozitář s konfiguracemi a vždy to nechal u balíčku. Kdyby se ten installer začal používat, tak pro tebe bude náročné a spíš nemožné kontrolovat, co ti tam kdo posílá. Což by se ještě dalo, ale problém jsou side effecty. Instalace balíčku změní své chování a přitom to z balíčku vůbec není patrné – nezmění se nic v jeho kódu a nemá žádnou přímou závislost na tom tvém repozitáři.

Zapomeň na wwwDir, je to příliš nette-specific. Drž se unixového standardu a použij název publicDir (symfony v4 je strukturované podle něj)

Zapřemýšlel bych nad tím, zda by nebylo vhodnější místo popisu v composer.json udělat instalační skript včetně průvodce. My v contributte máme momentálně jen něco na doplnění konfigurace neonu – https://github.com/…tte/neonizer
Představuju si to tak, že budu mít instalační třídu, která bude mít parametry jako publicDir, configDir apod. a bude se mě v průběhu instalace ptát na jednotlivé parametry vygenerované konfigurace. Bylo by tak možné při instalaci balíku rovnou nastavit připojení k databázi a přenastavit výchozí hodnoty – např. ta webtemp directory z příkladu je něco, co budu téměř jistě chtít měnit a tak nechci. aby se mi výchozí hodnota zapsala i do gitignore.
Vyřeší se tím i odinstalace – univerzálně to nevyřešíš, často chci při odinstalaci data ponechat (nebo jsem změnil cestu k nim). Stejně tak tím vyřešíš příkazy.

A ještě mám dotaz – ještě jsem to nepouštěl, ale máš tam nějak pojištěné třeba to, že smažu vendor a composer.lock? Aby to nekonfigurovalo od znova. Mě napadá použít soubor (composer-synchronizer.lock), do kterého by se zapsalo, co už se spustilo.

Editoval Mabar (4. 5. 2018 15:51)

Machy8
Člen | 59
+
0
-

@Mabar

  • Když se nainstaluje balíček, v jakékoliv verzi, který má konfiguraci (extra → composer-synchronizer → nette2), tak se po sesynchronizování zapíše jméno balíčku do composer-synchronizer.lock v adresáři projektu a znovu se to synchronizovat nebude. Když se .lock přidá do repozitáře s projektem, tak se při buildu již nic spouštět nebude.
  • Při odinstalaci balíčku se jméno balíčku odstraní z locku a při další instalaci se znovu sesynchronizuje.
  • Přidám možnost pro vypnutí / zapnutí remote balíčků.
  • Přidám i možnost nezamykat zvolené balíčky během vývoje do lock souboru
  • Zvážím, jestli nahradit wwwDir za publicDir. Nevím ale, jestli to nebude matoucí. Nette má www adresář, nikoliv public. Ikdyby si někdo wwwDir změnil na cokoliv jiného, tak bude nahrazovat původní cestu k www adresáři a ne k public adresáři.

Editoval Machy8 (5. 5. 2018 0:02)