質問する質問する
 

回答済みPowerShellによる依存性解決

  • 2009年8月26日 1:06kanryu ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    .NET Frameworkによる開発を行っているため、
    それと親和性の高いPowerShellを開発で活用していこうと考えているのですが、ひとつ気になることがあります。

    UnixにおけるMakefileのような依存性解決の仕組みはPowerShellには存在するのでしょうか?
    できればRubyにおけるRakeのように、PowerShellの書式で依存記述ができると望ましいです。

回答

  • 2009年9月16日 9:56佐祐理 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    NMakeをすすめるなら、MSBuild の方がいいかと。
    MSBuildは簡単に言えばAntのようなものです。Visual Studioも内部的にはMSBuildを使ってビルドをしていますし、.csprojファイルや.vbprojファイル自身はMSBuildのプロジェクトファイルです。
    Engineクラス を使えば、PowerShellからビルドを行うこともできます。
    • 回答としてマークkanryu 2009年9月24日 0:39
    • 回答の候補に設定渋木宏明MVP2009年9月17日 6:09
    •  

すべての返信

  • 2009年9月16日 9:41高橋 春樹MSFT, モデレータユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    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はいろいろな機能がサポートされているので、是非開発で使用してみてください。

    この情報が少しでもお役に立てれば幸いです。
    その他アドバイスがありましたら、ご投稿の程、よろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
  • 2009年9月16日 9:56佐祐理 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    NMakeをすすめるなら、MSBuild の方がいいかと。
    MSBuildは簡単に言えばAntのようなものです。Visual Studioも内部的にはMSBuildを使ってビルドをしていますし、.csprojファイルや.vbprojファイル自身はMSBuildのプロジェクトファイルです。
    Engineクラス を使えば、PowerShellからビルドを行うこともできます。
    • 回答としてマークkanryu 2009年9月24日 0:39
    • 回答の候補に設定渋木宏明MVP2009年9月17日 6:09
    •  
  • 2009年9月17日 1:30kanryu ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    丁寧な回答ありがとうございます。

    Makefile(Visual Stdioにおいてはnmake)についてはトピック投稿の段階で言及していますので、除外させてください。
    (nmakeについて言及してなかったため、わざわざお手数をおかけしました。申し訳ありません)

    従来からあるものとしては、他にmsbuild、NAntなども挙げられるでしょうか。

    今回のトピックではPowerShell独自の依存性解決ツールは無いか、という呼びかけだとお考えください。
  • 2009年9月17日 2:34佐祐理 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    PowerShellを言語ととらえてC言語に置き換えると「C言語独自の依存性解決ツールは無いか(ただしmakeやMSBuildは除外する)」になります。
    PowerShellをコマンドインタプリタととらえてCMD.EXEに置き換えると「CMD.EXE独自の依存性解決ツールは無いか(ただしmakeやMSBuildは除外する)」になります。
    どちらにしても、何を求められているのかさっぱりわかりません。
  • 2009年9月17日 5:09kanryu ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    PowerShellを言語ととらえてC言語に置き換えると「C言語独自の依存性解決ツールは無いか(ただしmakeやMSBuildは除外する)」になります。
    そういう質問です。
    RubyにおけるRakefileのようなツールはありますか、という質問です。
    ご存じないようでしたら一度調べてみてください。

    PowerShellのスクリプトで依存解決的な処理ができれば、という希望があるわけです。

    で、ちょっと自分で書き始めているところなんですが、
    案外コアの部分は簡単に書けるかもしれませんね。
  • 2009年9月17日 6:30kanryu ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    自己レスです。

    さっそく、簡単なものを試作してみました。
    http://knivez.homelinux.org/~spro/ps/pake-0.1.0.zip

    案外実用になるかも?

    感想などいただければ歓迎です。
  • 2009年9月17日 7:32佐祐理 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    Rake、Rakefileについては知りませんでした。
    PerlスクリプトでPerlモジュールのルールを定義するMakefile.PLを想像していました。

    RakeでRubyモジュールを定義するわけではないのですね。
    またサンプルを読ませてもらいましたが、pakeでPowerShellモジュール(??)を作るわけでもないのですね。

    やはり.NET Framework向けにはMSBuildやNAntがありますので、あえてPowerShellで表現する意味がないように思います。もちろん趣味で作る分には構わないでしょうけど。

    結局のところこの質問に対しては「ありません」が答えなんでしょうね。
  • 2009年9月18日 3:53kanryu ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    やはり.NET Framework向けにはMSBuildやNAntがありますので、あえてPowerShellで表現する意味がないように思います。もちろん趣味で作る分には構わないでしょうけど。
    そもそもPowerShellは.NET Frameworkのために作られたわけではなく.NET Frameworkで実装されているだけのことです。
    Windows上で汎用に動作するように設計されており、バッチファイルやWSHの代替として手広く使われることが想定されています。
    (例えばMakefileがプログラムのビルドだけでなく、サーバー管理の現場で広く使われていることを考えてください)

    その際、特段の追加のインストールの必要なく依存性解決の仕組みが用意されていることは、大きな意味があると思います。

    ひとまず、今回の成果はPowerShell Community Extensionsのほうに投げておくことにします。
  • 2009年9月19日 4:51kanryu ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    psake という同様のプロジェクトがすでにあることを教えていただきました。
    こちらはすでにいくらか使われているようですね。
    とりあえずこれを使ってみて、機能の不足を感じれば作者に問い合わせることにしたいと思います。
  • 2009年9月24日 0:43kanryu ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    質問者の私としてはpsakeを触ってみて改めて考えるといったところですが、 一般的な回答としては佐祐理さんの記事が適切と思われますので 回答としてのマークをつけます。

     高橋さんの記事も参考になると思われますので投票しておきます。 どうもありがとうございました。

    なお、MSBuildは.NET Framework 2.0に標準で含まれており、その意味でも利用しやすいツールであることを補足しておきます。
  • 2009年9月24日 9:52佐祐理 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    psakeなんてのもあったんですね。
    ただ、psakeもkanryuさんの作られたpakeもPowerShellが.NETであることを活かした実装というわけではなく、C言語で記述されたmakeに対してPowerShell言語で記述されたpake、ということにしかならないのが残念です。

    先に挙げたEngineクラスを使うためにはMSBuildプロジェクトファイルを作成する必要があるため意味がありませんが、CSharpCodeProviderクラス などを使うことで直接コンパイラを呼び出すという手はあるかもしれません。…でもリソースの処理などいろいろと大変なところはあるかも。
  • 2009年9月25日 1:15kanryu ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    ただ、psakeもkanryuさんの作られたpakeもPowerShellが.NETであることを活かした実装というわけではなく、C言語で記述されたmakeに対してPowerShell言語で記述されたpake、ということにしかならないのが残念です。

    その認識はやや適切とはいえないように思うのですが、いかがでしょうか。

    PowerShellというファイル・コマンド操作に特化しつつ、かなりのレベルでプログラミングが可能なスクリプト言語をそのまま使って依存性解決を記述できること自体に意味があるのです。
    誰もC言語で依存性解決を直接書こうなんて思わないですよね?

    記述が非常に冗長の割りに使える構文に制限が多いNAntやMSBuildは、私は個人的にあまり好みません。
    少なくともIDEで入力補助が得られる環境じゃないと使う気になれないですね。
    (昔商用のJavaプロダクトのビルドがAntで記述されてて実行するだけでメモリが150MB食われてめちゃめちゃ重かったことがトラウマに……。まあRakefileで書かれたRubyの依存性解決も大概重いですが)

    依存性解決を記述するのは独特の難しさがありますが、いったん書いておくとずっと使えて便利なのでPowerShellにもよりよい環境が整備されていくことを望みたいところです。
  • 2009年9月26日 4:39佐祐理 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    最初の質問に、.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を自作しないとやってられません。