Maya Module 起動処理の注意点

# はじめに
Maya においてスクリプトやプラグインの配布に使用する [Maya module] (http://help.autodesk.com/view/MAYAUL/2019/ENU/?guid=Maya_SDK_MERGED_Distributing_Maya_Plug_ins_Maya_module_paths_folders_and_html) についての注意点について述べる。Maya Module 自体の解説についてはここでは行わない。以下に参考リンクをあげる。

[　スクリプトやプラグインを配布できる環境を作ろう！ - SEN_Aのじゆうちょう](http://hesperas.blog134.fc2.com/blog-entry-248.html)
[【Maya】プラグイン配布の構成を考える - するめとめがね](https://tm8r.hateblo.jp/entry/2016/10/18/222755) 


公式の[レファレンスページ](http://help.autodesk.com/view/MAYAUL/2019/ENU/?guid=Maya_SDK_MERGED_Distributing_Maya_Plug_ins_Maya_module_paths_folders_and_html) によると

```
引用

> 注：
> 拡張子に関係なく、すべてのモジュールファイルが Maya によって読み取られます。 

```

と書かれている。この記事ではこの挙動が引き起こす問題について説明する。


## 挙動
注によると

 - 拡張子関係なく
 - 全モジュールファイルを
 - 読み込む

とある。拡張子が関係ないというのは解説不要だろう。では *`全モジュールファイル`* とは何のことか？それは `MAYA_MODULE_PATH` の通ったフォルダに置かれた **すべてのファイル** のことを意味する。（サブフォルダの探索はおこなわない）『.modファイルや、それに類する記載がされたファイルのこと』**ではない**。また、レファレンスには読み込みタイミングについては記載されていないが、 **Maya起動時** にすべてのファイルを読み込む。そしてすべてのファイルに対して `モジュール定義ファイル` （ *以下いわゆる .modファイルのことを当記事ではこのように呼称する* ）としての処理を施す。何がおこるか。

 - 全ファイル読み込み完了まで起動が進まない
    - うっかり巨大なファイルを置くと数分、数十分またされる
 - 意図しないファイルが `モジュール定義ファイル` として誤認される
    - バイト列にたまたまそれっぽく解釈されうるものがあると誤った設定がなされる


## 誤認されるとどうなるの？
読み込みに時間がかかるのは説明不要だろう。では誤認されると何が起きるか。本来のモジュール定義の役割、つまり環境変数の設定がおもな役割であるが、この環境変数に誤った設定がはいりこむ。例えば `MAYA_MODULE_PATH` に `maya_modules/sample` を通した状態で 危険な `maya_modules/sample/danger.gif` を置いたとする。

```python

import os
for pp in os.getenv("MAYA_PLUG_IN_PATH").split(";"):
    print(pp)

"""
C:/Program Files/Autodesk/Maya2019/bin/plug-ins
D:/maya_modules/sample/ｺ・}*淀"(JﾔﾏJｽ錣・・@ｦｨZhﾑ・・([/plug-ins
D:/maya_modules/sample/・ッY桂ｼｨzｬ｣o・:ｱⅠÅﾜ!ﾋﾒﾉ慣Wd5ｫLｩVﾎﾖ5`/plug-ins
C:/Program Files/Autodesk/Maya2019/plug-ins/ATF/plug-ins
D:/maya_modules/sample/・rH"亨他wTrI&孚ｲｩ?・H*ｫｴ,	f(e*ﾚｲKｔjｦ#｣K4ﾓTsﾍ｣pﾊ,續sN:｡柎/・・ﾙL・ｬｧ2mB6UtQF7ｫ・dthEｧｫL3ﾕ4ｻ-・・jKQﾁﾜrT凸?/plug-ins
C:/solidangle/mtoadeploy/2019/plug-ins
...snip...
"""
```

このように `MAYA_PLUG_IN_PATH` （や他の環境変数にも）におかしな値がはいっていることがわかる。(*よくこんな状態で起動できるなと感心してしまう。ちなみに蛇足だがユーザーフォルダに日本語はいってる≒つまりWindowsアカウント日本語でつくっちゃうとmaya起動しないから要注意だ*）


## 誤認の原因
ここでの *危険なファイル* とはどのようなものだろうか？ `モジュール定義ファイル` の本来の役割、書き方から推測するに

```
サンプルとして挙げられている
+ PLATFORM:win64 CustomModule 3.10.5 ..¥CustomModule¥Modules¥win64 

を最小構成にしたもの
+ なんか文字 数字 なんか文字 終端文字

のバイト列表現
2B非文字文字数字20非文字
```

のような並びがファイル中にでてくるものが危険だ。（実際どのような読み込み処理なのかは autodesk のみぞ知るわけだが）この文字数字の箇所に本来テキストファイルとして書かれたものでない内容が入り込んでくるため `H"亨他wTrI&孚ｲｩ?・H*ｫｴ,	f(e*ﾚｲKｔjｦ#｣K4ﾓTsﾍ｣pﾊ,續sN:｡柎/・・ﾙL・ｬｧ2mB6UtQF7ｫ・d` のような意味不明な列がインジェクトされるのではないか。事前にわかるわけがない。


## 回避方法
危険があること、またその原因がわかったがではどのように回避するべきか。すべてのファイルを精査し安全・危険を判断することは現実的ではない。つまり現時点では **`MAYA_MODULE_PATH` の通ったファイルだに .mod ファイル以外を置くべきでない** といえる。もしくは .modファイル以外を置くのであれば起動してみて、環境変数がおかしくなっていないかの確認を行ってみよう。


## おわりに

いままで深く考えることなく

> 拡張子に関係なく、すべてのモジュールファイルが Maya によって読み取られます。 

を読み飛ばし（何度か目にしているはずなのに） .modファイルのみ読み込まれると考えていたのだが実際は違うということが分かった。どう考えても誰も得をしないような仕様だと思う（わざわざドキュメントでも .mod ファイルと書かれているにもかかわらず）のだが現実の製品がこうなっている以上、こちらで対応するしかない。


## おまけ
本題から外れるが、以下のようなmaya起動用バッチを用意するとバッチからの相対パスで特定フォルダ以下に複数のモジュールを MAYA_MODULE_PATH に設定した状態でmayaの起動が可能だ。

```sh
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0


set MAYA_UI_LANGUAGE=en_US

for /d %%a in ("%CD%\tool\maya_modules\*") do (
    set MAYA_MODULE_PATH=!MAYA_MODULE_PATH!;%%a
)

pushd "C:\Program Files\Autodesk\Maya2019\bin\"
start "maya" "C:\Program Files\Autodesk\Maya2019\bin\maya.exe"
popd

exit /b
```