4

Pythonプロジェクトでフロントエンドをテンプレート化するためにnunjucksを使用しています。Nunjucks テンプレートは、本番環境でプリコンパイルする必要があります。nunjucks テンプレートでは、拡張機能や非同期フィルターは使用しません。grunt-task を使用してテンプレートの変更をリッスンするよりも、nunjucks-precompile コマンド (npm 経由で提供) を使用して、テンプレート ディレクトリ全体を templates.js にスイープすることを好みます。

アイデアは、nunjucks-precompile --include ["\\.tmpl$"] path/to/templates > templates.jsコマンドを setup.py 内で実行することです。これにより、デプロイヤー スクリプトの通常の実行を簡単にピギーバックできます。

setuptools オーバーライドdistutils スクリプト引数が適切な目的を果たしている可能性があることを発見しましたが、どちらが最も簡単な実行方法であるかはわかりません。

別のアプローチは、subprocesssetup.py 内でコマンドを直接実行するために使用することですが、私はこれに対して警告されています (むしろ先制的に私見です)。なぜそうしないのか、私は本当に深く理解していません。

何か案は?アファメーション?確認?

更新 (2015 年 4 月): - コマンドを使用できない場合は、次のnunjucks-precompileように Node Package Manager を使用して nunjucks をインストールします。

$ npm install nunjucks
4

2 に答える 2

6

素早い自己回答をご容赦ください。これがエーテルの誰かを助けることを願っています。満足のいく解決策を見つけたので、これを共有したいと思います。

安全で、 Peter Lamut の書き込みに基づいたソリューションを次に示します。これは、サブプロセスの呼び出しで shell=True を使用しないことに注意してください。Python 展開システムで grunt-task 要件をバイパスし、これを難読化と JS パッケージ化に使用することもできます。

from setuptools import setup
from setuptools.command.install import install
import subprocess
import os

class CustomInstallCommand(install):
    """Custom install setup to help run shell commands (outside shell) before installation"""
    def run(self):
        dir_path = os.path.dirname(os.path.realpath(__file__))
        template_path = os.path.join(dir_path, 'src/path/to/templates')
        templatejs_path = os.path.join(dir_path, 'src/path/to/templates.js')
        templatejs = subprocess.check_output([
            'nunjucks-precompile',
            '--include',
            '["\\.tmpl$"]',
            template_path
        ])
        f = open(templatejs_path, 'w')
        f.write(templatejs)
        f.close()
        install.run(self)

setup(cmdclass={'install': CustomInstallCommand},
      ...
     )
于 2015-01-14T22:33:32.850 に答える