Imballare un plugin Discourse come un gem

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:

  1. 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.rb di un plugin di Discourse è racchiuso in un callback after_initialize.

  2. 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:

  1. In una gemma di plugin di Discourse, il file engine.rb svolge un ruolo simile al file plugin.rb, con alcune differenze di configurazione. Dai un’occhiata al file engine.rb della gemma del client di abbonamento e confrontalo con un file plugin.rb standard.

  2. In una gemma di plugin di Discourse, devi simulare discourse/discourse nei 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ò.

14 Mi Piace

Sembra che questo approccio non sia possibile per coprire qualsiasi cosa del tema di Discourse in un plugin? Forse un titolo migliore è “Impacchettare un Rails Engine specifico di Discourse come gemma”

1 Mi Piace

Corretto, devi gestire separatamente le cose del framework JS front-end

Sebbene tecnicamente accurato, non sarei d’accordo sul fatto che quel titolo sarebbe migliore in quanto metterebbe fuori strada alcune delle persone giuste dalla lettura dell’argomento: la maggior parte delle persone che scrivono plugin potrebbero non identificarli come “Rails Engine specifici per Discourse”

In realtà, separo più regolarmente il mio codice in plugin back-end e componenti tematici front-end ora in modo da poter iterare le cose front-end molto rapidamente nelle distribuzioni negli ambienti di staging e produzione.

3 Mi Piace

Sono d’accordo, anche se questo documento potrebbe essere utile solo per alcuni sviluppatori avanzati, dovrebbe coprire tutte le persone.

E grazie per aver condiviso questo.

1 Mi Piace

Concordo que é um tópico avançado.