Pavilion ha iniziato a impacchettare alcuni plugin di Discourse come ruby gems, a partire dal nostro client di abbonamento.
Il nostro client di abbonamento è ancora un plugin separato che ora carica questa gemma, ma il suo backend è ora interamente impacchettato come gemma e il plugin separato sarà presto deprecato del tutto. Questa è una piccola introduzione su come fare lo stesso con i tuoi plugin che sono più adatti ad essere gemme.
Come lavorare con le gemme
Innanzitutto, devi capire come lavorare con le ruby gems. Se non hai mai creato una gemma prima, ti consiglio di crearne una tua standard in isolamento prima di affrontare il lavoro con un plugin di Discourse come gemma. Ti consiglio questa guida:
Come i plugin iniettano codice in Discourse
Il modo in cui una gemma di plugin di Discourse inietta codice in Discourse è esattamente lo stesso modo in cui lo fa un plugin standard. L’unica differenza è l’impacchettamento. Quindi, per lavorare con un plugin come gemma, dovrai anche capire come un plugin standard inietta codice in Discourse. Ci sono essenzialmente due cose da capire qui:
-
Un plugin di Discourse è un rails engine. Probabilmente ne sei già consapevole, ma dovrai capire davvero cosa significa. Ti consiglio di consultare questa guida sui Rails engines. Ad esempio, dovrai capire perché gran parte del codice nel file
plugin.rbdi un plugin di Discourse è racchiuso in un callbackafter_initialize. -
Come funziona il processo di inizializzazione di Discourse. C’è davvero solo un file da leggere e capire qui, ovvero il file discourse/discourse/config/application.rb. È lì che viene caricata la maggior parte del codice rails, dove viene caricato tutto il codice dei plugin e dove vengono inizializzati i plugin. Esamina quel file in profondità e comprendi dove e come vengono richiesti i file dei plugin e poi inizializzati.
Come funziona un plugin di Discourse come gemma
Per mettere tutto insieme, dovrai capire come i due argomenti sopra vengono sintetizzati in una gemma di plugin di Discourse. In particolare, nota quanto segue:
-
In una gemma di plugin di Discourse, il file
engine.rbsvolge un ruolo simile al fileplugin.rb, con alcune differenze di configurazione. Dai un’occhiata al file engine.rb della gemma del client di abbonamento e confrontalo con un fileplugin.rbstandard. -
In una gemma di plugin di Discourse, devi simulare
discourse/discoursenei tuoi test rspec per testare correttamente la gemma. Non devi simulare l’intera app di Discourse, solo le parti contro cui stai testando. Lo fai creando un’app rails scheletrica con le classi e gli endpoint specifici di Discourse di cui hai bisogno e caricandola come supporto rspec. Vedi l’app Discourse mock della gemma del client di abbonamento e dove viene caricata nel rails_helper.rb dei spec.
Come caricare una gemma locale in un plugin di Discourse
Per caricare la tua versione locale di una gemma in un plugin di Discourse quando lavori con quel plugin e gemma in sviluppo, devi fare quanto segue.
Collega simbolicamente la tua cartella gemma alla cartella gemma del plugin pertinente. Ad esempio, per lavorare con la mia versione locale della gemma discourse_subscription_client nel plugin discourse-subscription-client, faccio quanto segue:
ln -s /Users/angus/discourse/gems/discourse_subscription_client /Users/angus/discourse/discourse/plugins/discourse-subscription-client/gems/3.2.1/gems
Quindi cambia la cartella gemma collegata simbolicamente nel plugin per utilizzare lo stesso schema di denominazione di una cartella gemma standard, ad esempio:
discourse_subscription_client-0.1.0.pre11
Ora, quando il tuo plugin caricherà la tua gemma di plugin di Discourse, caricherà la tua versione locale invece di quella su rubygems.
Se hai domande o sei bloccato, posta qui e ti aiuterò.