IT プロフェッショナルのための技術情報サイト >
フォーラム ホーム
>
Windows Powershell フォーラム
>
Windows PowerShell
>
PowerShellによる依存性解決
PowerShellによる依存性解決
- .NET Frameworkによる開発を行っているため、
それと親和性の高いPowerShellを開発で活用していこうと考えているのですが、ひとつ気になることがあります。
UnixにおけるMakefileのような依存性解決の仕組みはPowerShellには存在するのでしょうか?
できればRubyにおけるRakeのように、PowerShellの書式で依存記述ができると望ましいです。
回答
すべての返信
kanryuさん、こんにちは。フォーラムオペレーターの高橋春樹です。
Windows開発でIDE(統合開発環境)を使わないコマンドラインベースの開発作業を行う場合、
Unixと同様makefileを作成し、プログラムのビルドを行うことが出来ます。Makefileの作成方法は、下記のMSDNサイトと外部サイトを参考にしてください。
NMAKE リファレンス
http://msdn.microsoft.com/ja-jp/library/dd9y37ha.aspx自動化のための nmake 入門講座
http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/nmake.htmlコマンドラインベースの開発作業においては、PowerShellもしくはコマンドプロセッサ上で、このnmakeを実行させます。
PowerShellはいろいろな機能がサポートされているので、是非開発で使用してみてください。この情報が少しでもお役に立てれば幸いです。
その他アドバイスがありましたら、ご投稿の程、よろしくお願いします。
マイクロソフト株式会社 フォーラム オペレーター 高橋春樹- 丁寧な回答ありがとうございます。
Makefile(Visual Stdioにおいてはnmake)についてはトピック投稿の段階で言及していますので、除外させてください。
(nmakeについて言及してなかったため、わざわざお手数をおかけしました。申し訳ありません)
従来からあるものとしては、他にmsbuild、NAntなども挙げられるでしょうか。
今回のトピックではPowerShell独自の依存性解決ツールは無いか、という呼びかけだとお考えください。 - PowerShellを言語ととらえてC言語に置き換えると「C言語独自の依存性解決ツールは無いか(ただしmakeやMSBuildは除外する)」になります。
PowerShellをコマンドインタプリタととらえてCMD.EXEに置き換えると「CMD.EXE独自の依存性解決ツールは無いか(ただしmakeやMSBuildは除外する)」になります。
どちらにしても、何を求められているのかさっぱりわかりません。 PowerShellを言語ととらえてC言語に置き換えると「C言語独自の依存性解決ツールは無いか(ただしmakeやMSBuildは除外する)」になります。
そういう質問です。
RubyにおけるRakefileのようなツールはありますか、という質問です。
ご存じないようでしたら一度調べてみてください。
PowerShellのスクリプトで依存解決的な処理ができれば、という希望があるわけです。
で、ちょっと自分で書き始めているところなんですが、
案外コアの部分は簡単に書けるかもしれませんね。- 自己レスです。
さっそく、簡単なものを試作してみました。
http://knivez.homelinux.org/~spro/ps/pake-0.1.0.zip
案外実用になるかも?
感想などいただければ歓迎です。 - Rake、Rakefileについては知りませんでした。
PerlスクリプトでPerlモジュールのルールを定義するMakefile.PLを想像していました。
RakeでRubyモジュールを定義するわけではないのですね。
またサンプルを読ませてもらいましたが、pakeでPowerShellモジュール(??)を作るわけでもないのですね。
やはり.NET Framework向けにはMSBuildやNAntがありますので、あえてPowerShellで表現する意味がないように思います。もちろん趣味で作る分には構わないでしょうけど。
結局のところこの質問に対しては「ありません」が答えなんでしょうね。 やはり.NET Framework向けにはMSBuildやNAntがありますので、あえてPowerShellで表現する意味がないように思います。もちろん趣味で作る分には構わないでしょうけど。
そもそもPowerShellは.NET Frameworkのために作られたわけではなく.NET Frameworkで実装されているだけのことです。
Windows上で汎用に動作するように設計されており、バッチファイルやWSHの代替として手広く使われることが想定されています。
(例えばMakefileがプログラムのビルドだけでなく、サーバー管理の現場で広く使われていることを考えてください)
その際、特段の追加のインストールの必要なく依存性解決の仕組みが用意されていることは、大きな意味があると思います。
ひとまず、今回の成果はPowerShell Community Extensionsのほうに投げておくことにします。- psake という同様のプロジェクトがすでにあることを教えていただきました。
こちらはすでにいくらか使われているようですね。
とりあえずこれを使ってみて、機能の不足を感じれば作者に問い合わせることにしたいと思います。 - 質問者の私としてはpsakeを触ってみて改めて考えるといったところですが、 一般的な回答としては佐祐理さんの記事が適切と思われますので 回答としてのマークをつけます。
高橋さんの記事も参考になると思われますので投票しておきます。 どうもありがとうございました。
なお、MSBuildは.NET Framework 2.0に標準で含まれており、その意味でも利用しやすいツールであることを補足しておきます。 - psakeなんてのもあったんですね。
ただ、psakeもkanryuさんの作られたpakeもPowerShellが.NETであることを活かした実装というわけではなく、C言語で記述されたmakeに対してPowerShell言語で記述されたpake、ということにしかならないのが残念です。
先に挙げたEngineクラスを使うためにはMSBuildプロジェクトファイルを作成する必要があるため意味がありませんが、CSharpCodeProviderクラス などを使うことで直接コンパイラを呼び出すという手はあるかもしれません。…でもリソースの処理などいろいろと大変なところはあるかも。 ただ、psakeもkanryuさんの作られたpakeもPowerShellが.NETであることを活かした実装というわけではなく、C言語で記述されたmakeに対してPowerShell言語で記述されたpake、ということにしかならないのが残念です。
その認識はやや適切とはいえないように思うのですが、いかがでしょうか。
PowerShellというファイル・コマンド操作に特化しつつ、かなりのレベルでプログラミングが可能なスクリプト言語をそのまま使って依存性解決を記述できること自体に意味があるのです。
誰もC言語で依存性解決を直接書こうなんて思わないですよね?
記述が非常に冗長の割りに使える構文に制限が多いNAntやMSBuildは、私は個人的にあまり好みません。
少なくともIDEで入力補助が得られる環境じゃないと使う気になれないですね。
(昔商用のJavaプロダクトのビルドがAntで記述されてて実行するだけでメモリが150MB食われてめちゃめちゃ重かったことがトラウマに……。まあRakefileで書かれたRubyの依存性解決も大概重いですが)
依存性解決を記述するのは独特の難しさがありますが、いったん書いておくとずっと使えて便利なのでPowerShellにもよりよい環境が整備されていくことを望みたいところです。- 最初の質問に、.NET Frameworkとの親和性について触れられていました。でもpakeもpsakeも親和性はあまり関係ないですよね、というのが先のコメントです。
もし親和性を意識しているなら、例えばrakeをIronRubyで動かせばそれでうれしいですか? きっとそうではなくrakeはRuby構文で記述できることに意義があり、同様にpake / psakeもPowerShell構文で記述することに意義があるのだと受け取りました。
依存性解決といっても最終的にはタイムスタンプ比較で、とりわけFileInfoクラスを使うことがうれしいというわけではないでしょう。
さて.NET Frameworkによる開発ということですが、C# / VBは単純にコンパイルするだけでなく、リソースのコンパイルやmanifestの埋め込みなどビルド手順は結構やっかいです。ここに.aspxや.xamlなどの処理が加わりますし、C++/CLIになると.h / .obj / .lib / .dllの話が追加され更にやっかいです。これらを自前で実装するのはちょっとなぁ、と。
NAntについてはわかりませんが、MSBuildについてはVisual StudioのIDEが魔法のプログラムというわけではなく、用意されたスキーマに従って入力補完しているだけで、同等の機能を持つXML Editorがあればそれでもいいですよ。
%ProgramFiles%\Microsoft Visual Studio 9.0\Xml\Schemas\1041\Microsoft.Build.xsd
%ProgramFiles%\Microsoft Visual Studio 9.0\Xml\Schemas\1041\MSBuild\*.xsd
# ソリューションエクスプローラーでのItemの編集という意味では代替できませんね。
使える構文に制限が多いのは同意します。Taskを自作しないとやってられません。