はじめに
例えばTablrはService APIを用いてパッケージ内の一部クラスを外部からでも利用できるようにしているが、たまにこういった外部からアクセスできる手段を用意していないクラスを利用したくなるときがある。
そのような場合どうするのかを考えてみた。
実現するためにドキュメントに載っていないプロパティにアクセスしていることと、そもそも外部から読むことを想定していないモジュールを無理やりロードするのはあまり行儀がよろしくない行為と考えられるため、多用は避けたほうが無難だと思われる。
1. 目当てのファイル名を確認する
インストール済みのパッケージであれば設定画面から辿ればソースコードを開けるので、そちらで確認する。
よく分からなければ公式サイトのパッケージ検索から検索し「Repo」を開けばGitHub等のレポジトリにアクセスできるので、そちらから確認する。
2. パッケージのディレクトリパスを取得する
PackageManagerのgetLoadedPackage()
メソッドを利用することで指定のパッケージの情報を得ることができる。
getLoadedPackage()
の返り値はPackageのインスタンスで、APIドキュメントにはほとんど記述がないがv1.2.4時点ではpath
プロパティでパッケージがインストールされているディレクトリのフルパスを得ることが出来る。
3. 目当てのファイル名のフルパスを作ってrequire()
に放り込む
1と2の方法で得た情報で目当てのファイルのフルパスを作ることが出来るので、require()
にフルパスを放り込むとロードすることができる。
実装例: settings-viewのPackageManager
をrequireする
path = require "path"
fs = require "fs"
if atom.packages.isPackageLoaded "settings-view"
pkg = atom.packages.getLoadedPackage "settings-view"
modulePath = path.join pkg.path, "lib", "package-manager.js"
PackageManager = require modulePath if fs.existsSync modulePath