Arkkitehtuurin yleiskuva¶
Liitännäisjärjestelmä on rakennettu kolmesta komponentista, jotka kaikki ovat kansiossa
Components/:
| Komponentti | Näkyvyys | Vastuu |
|---|---|---|
PluginApi |
Julkinen | Puhtaita abstrakteja rajapintoja ja arvotyyppejä. Ei Qt:tä, ei Scintillaa, ei MTE:n sisäisiä otsikkotiedostoja — vain standardikirjasto. |
PluginHost |
Sisäinen | Lataa, omistaa ja välittää liitännäisille. Qt on täällä toteutusyksityiskohta (se käyttää kulissien takana luokkaa QPluginLoader). |
Plugins |
Omatekoiset | Esimerkki- ja sisäänrakennettuja liitännäisiä; kukin oma CMake-kohteensa, joka riippuu vain kohteesta PluginApi (ja Qt:stä, kun natiivia taustajärjestelmää käytetään). |
Suunnitteluperiaatteet¶
- Taustajärjestelmästä riippumaton sopimus. Kaikki
PluginApi-tyypit sijaitsevat nimiavaruudessaMTE::plugineivätkä ne saa sisällyttää mitään Qt-, Scintilla- tai MTE:n sisäistä otsikkotiedostoa. Tämä on se, mikä antaa tulevan Python-taustajärjestelmän toteuttaa saman sopimuksen ilman Qt:n vastarintaa. - Ei kolmannen osapuolen tyyppejä julkisen API:n yli. Liitännäiset eivät koskaan näe
Scintilla- tai Qt-tyyppejä; isäntä sovittaa sisäisen
IEditorView-rajapinnan ja julkisenIEditorService-rajapinnan välillä. - RAII kaikkialla. Komennon, valikkokohdan, telakkapaneelin tai tapahtumatilauksen
rekisteröinti palauttaa poletin tai tilauskahvan. Sen tuhoaminen poistaa panoksen
rekisteröinnin. Liitännäiset pitävät poletteja jäseninään, joten kaikki puretaan
automaattisesti funktiossa
shutdown().
Elinkaari¶
Kukin liitännäinen toteuttaa yhden rajapinnan, IPlugin:
class IPlugin {
public:
virtual ~IPlugin() = default;
virtual PluginInfo info() const = 0;
virtual bool initialize(IPluginContext& ctx) = 0;
virtual void shutdown() noexcept = 0;
};
info()palauttaa POD-metatietoja (id,name,version,vendor,description,apiVersion).initialize(ctx)vastaanottaaIPluginContext-palveluhakemiston. Liitännäinen nappaa tarvitsemansa palvelut ja rekisteröi komentonsa, valikkonsa, paneelinsa ja tapahtumatilauksensa.shutdown()ajetaan poistuttaessa; koska panokset ovat RAII-poletteja, tavanomainen purkaminen on yleensä vain jäsenten tuhoutumisen sallimista.
Ei kuumaa uudelleenlatausta
Liitännäisen ottaminen käyttöön, poistaminen käytöstä, asentaminen ja poistaminen tulevat kaikki voimaan seuraavalla käynnistyksellä. Isäntä ei koskaan lataa tai poista liitännäiskoodia ajon aikana — tämä pitää mallin yksinkertaisena ja kiertää Windowsin ongelman, jossa »ladattua DLL:ää ei voi poistaa«.
Etsintä¶
Isäntä käy läpi järjestyksessä:
<exe-dir>/Plugins/— mukana tulevat omatekoiset liitännäiset.<AppLocalData>/Plugins/— käyttäjäkohtainen asennushakemisto.- Polut ympäristömuuttujasta
MTE_PLUGIN_PATH.
Kukin hakemisto käydään läpi irrallisten kirjastojen ja yhden tason välittömien
alihakemistojen osalta (liitännäiskohtainen <id>/-rakenne, jonka asennusohjelma tuottaa).
Etsintä ei etene syvemmälle.