LibreOffice5(9)oxtファイルによる拡張機能の更新の反映はLibreOfficeの再起動が必要

2015-12-13

旧ブログ

t f B! P L

前の関連記事:LibreOffice5(8)oxtファイルをzip圧縮するときは最初の階層に注意


拡張機能マネージャーに登録した拡張機能を更新したあと、それが反映されていないことに気がついたので反映されるタイミングについて調べてみました。LibreOfficeは5.0.2.2です。例として使った拡張機能はPython-UNO bridgeにでてくるtuplestrm.pyとpython-tokencounter-calc-addin.oxtです。

拡張機能マネージャーに登録すると~/.config/libreoffice/4/user/uno_packages/cache/uno_packagesフォルダにキャッシュされる

# -*- coding: utf-8 -*-
import unohelper
from com.sun.star.io import XOutputStream
class TupleOutputStream(unohelper.Base, XOutputStream):  # com.sun.star.io.XOutputStreamインターフェイスを継承。
    def __init__(self, ctx):  # UNOコンポーネントではXSCRIPTCONTEXTではなくコンポーネントコンテクストを受けとることに注意。
        self.ctx = ctx
    def flush(self):  # XOutputStreamインターフェイスのメソッドを実装。Writerに書き出すテスト。予めWriterを起動しておくことが必要。
        doc = self.ctx.getServiceManager().createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx).getCurrentComponent()
        doc.getText().setString("Hello World!(tuplestrm.pyからの書き込み)")
g_ImplementationHelper = unohelper.ImplementationHelper()  # g_ImplementationHelperという変数名は変更不可かつ必須。
g_ImplementationHelper.addImplementation(TupleOutputStream, "org.openoffice.pyuno.PythonOutputStream", ("com.sun.star.io.OutputStream",), )
tuplestrm.pyは動作確認できるようにLibreOffice5(6)既存インターフェイスを継承してPythonスクリプトをUNOコンポーネント化する例:その1でこのように変更したものを使いました。

まずtuplestrm.pyの例を拡張機能マネージャーに登録してみます。


pyファイルを直接拡張機能マネージャーに登録するときはファイル選択ダイアログで「UNO Python Component」を選択する必要があります。


tuplestrm.pyが拡張機能マネージャーに登録されました。

tuplestrm.pyを選択すると「無効にする」ボタンと「削除」ボタンが表示されます。

LibreOfficeに取り込まれたtuplestrm.pyは~/.config/libreoffice/4/user/uno_packages/cache/uno_packagesフォルダをみると確認することができます。


lu447433uo4u.tmp_フォルダの中をみると拡張機能マネージャーに登録されたtuplestrm.pyファイルがそのまま入っています。

拡張機能マネージャーを使うときに~/.config/libreoffice/4/user/uno_packages/cache/uno_packagesフォルダをファイルマネージャで開いたままにしているとLibreOfficeがクラッシュします。

なので拡張機能マネージャーを使うときはこのフォルダは開いておかないようにする必要があります。
        doc.getText().setString("Hello World!(tuplestrm.pyからの書き込み2)") 
tuplestrm.pyの内容の9行目のテキストの最後に「2」を追加して拡張機能マネージャーで更新してみます。

更新方法は単純に新規登録と同様に「追加」ボタンで追加するだけです。


「OK」ボタンをクリックするとインストール済みの拡張機能を置き換えると言ってくれます。


「OK」ボタンをクリックして~/.config/libreoffice/4/user/uno_packages/cache/uno_packagesフォルダをみると新たにlu55943qp40y.tmp_ができていてその中に新しいtuplestrm.pyファイルが入っていました。
def Tuplestrm_test():
    ctx = XSCRIPTCONTEXT.getComponentContext()
    tupleStrm = ctx.getServiceManager().createInstanceWithContext("com.sun.star.io.OutputStream",ctx)
    tupleStrm.flush()
tuplestrm_test.pyというPythonマクロを作成してtuplestrm.pyをマクロをWriterから呼び出してみるとちゃんと更新された方のtuplestrm.pyが実行されました。

LibreOfficeを再起動して拡張機能マネージャーを起動したときに未登録のキャッシュが削除される


使われなくなった方のtuplestrm.pyのキャッシュがいつ削除されるのか~/.config/libreoffice/4/user/uno_packages/cache/uno_packagesフォルダを観察してみました。

LibreOfficeを再起動しても削除されず、削除されたのは再起動後に拡張機能マネージャーを起動したタイミングでした。

拡張機能マネージャーで「削除」ボタンを押して削除した拡張機能についても同様のタイミングでキャッシュが削除されました。

と、ここまでの挙動は敢えて記事にするほどのことはないのですが困ったことになったのがoxtファイルの更新です。

oxtファイルを拡張機能マネージャーに登録すると展開して~/.config/libreoffice/4/user/uno_packages/cache/uno_packagesフォルダにキャッシュされる



python-tokencounter-calc-addin.oxtファイルを拡張機能マネージャーに登録しました。


~/.config/libreoffice/4/user/uno_packages/cache/uno_packagesフォルダにできたキャッシュフォルダの中をみてみるとpython-tokencounter-calc-addin.oxtという名前のフォルダができていました。


python-tokencounter-calc-addin.oxtフォルダの中をみるとpython-tokencounter-calc-addin.oxtファイルの中身が展開されて入っています。

python-tokencounter-calc-addin.oxtはCalcにtokencounという関数を追加する拡張機能です。

引数のセルにある単語数を返します。


Calcを起動してセルに=tokまで入力するとTOKENCOUNT()とでてくることでpython-tokencounter-calc-addin.oxtが動作していることが確認できます。


Enterキーを押すと関数名が補完されるのでさらに2つの単語が入力されたA2セルを選択してEnterキーを押すと関数の戻り値がA1に反映されます。


さて問題はこのpython-tokencounter-calc-addin.oxtの更新です。

oxtファイルの更新内容はLibreOfficeを再起動しないと反映されない


まずpython-tokencounter-calc-addin.oxtを展開してpythonpath/org/openoffice/comp/addin/sample/pythonフォルダにあるtokencounter.pyファイルを編集して10倍の値が返るようにします。
    def tokencount( self, str ):
        # certainly not the most efficient way to implement ...
        return len( str.split() ) * 10
これでpython-tokencounter-calc-addin.oxtを作りなおして拡張機能マネージャーで更新します。


pyファイルのときと同様にoxtファイルを置き換えるか聞いてくるので「OK」します。

新しいキャッシュフォルダ作成され更新時刻が新しい方のフォルダの中のpythonpath/org/openoffice/comp/addin/sample/python/tokencounter.pyを確認するとちゃんと戻り値が10倍になったtokencount()関数が入っています。


ところがCalcでtokencount()関数を使ってみると更新前の戻り値が返ってきます。

新しいCalcファイルで実行しても同じ結果です。

LibreOfficeを再起動してみます。


pyファイルの時と違ってLibreOfficeを再起動するだけで古いキャッシュファイルが削除されました。


今度は更新された新しいoxtファイルのtokencount()関数の戻り値が返ってきました。

ということでpyファイルの拡張機能を更新する場合と違ってoxtファイルの拡張機能は拡張機能マネージャーで更新してもLibreOfficeを再起動するまでは更新後のoxtファイルの内容が反映されないので注意が必要です。

私の場合はoxtファイルの動作確認をした記事をごっそり書き直す必要がありました、、、

Implementing UNO components with multiple source filesを読むとpthonpathフォルダをもつoxtファイルのみLibreOfficeの再起動が必要なことが書いてあるように思いますが、pythonpathを使わないoxtファイルも変更内容の反映にはLibreOfficeの再起動が必要でした。

参考にしたサイト


Python-UNO bridge
pyファイルによる拡張機能とoxtファイルによる拡張機能の例が載っています。

次の関連記事:LibreOffice5(10)Calcに関数を追加するPython拡張機能の例その1

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ