ビルド前イベントを活用する、その7

ビルド前イベントにおいて独自のツールに引数を与える方法を下記の記事で示しました。

ビルド前イベントを活用する、その6

ビルド前イベントにおいて独自のツールに引数を与えてみましょう。 下記のようなソースコードを書いてみました。実行時の引数に "continue" を指定したときだけビルドを開…

上記の記事よりも、もう少し実践的な引数を与えてみましょう。プロジェクトファイル *.csproj が配置されているディレクトリの二つ上にあるディレクトリに格納されている *.cs ファイルをすべて列挙するというツールを作ってみます。

c:/tmp/sss/aaa/aaa.csproj
というディレクトリにプロジェクトがあり、

c:/tmp/mylib
という検索対象のディレクトリがあるとします。ファイルは Fig. 1に示すように、それぞれ1個、2個、3個の cs ファイルが格納されています。

Fig. 1 検索対象のディレクトリ構成

下記が cs ファイルを列挙するソースコードになります。

using System;
using System.IO;

namespace tool
{
	internal class Program
	{
		// デフォルトだと戻り値は void だが、これを int にする.
		static int Main( string [] args )
		{

			if ( args.Length == 0 )
			{
				Console.WriteLine( "Error: args.Length == 0." );
				return -1; // ビルドをしない.
			}

			// 実行時引数を取得する.
			String str = args[0];

			// 相対パス混じりのパスからフルパスを取得する.
			String dir_top = Path.GetFullPath( str );

			// 検索トップのディレクトリが存在するか調べる.
			if (!( Directory.Exists( dir_top )))
			{
				Console.WriteLine( $"ディレクトリがありませんでした. {dir_top}" );
				return -1; // ビルドをしない.
			}

			// 検索トップのディレクトリを表示する.
			Console.WriteLine( "下記のディレクトリ配下を検索します." );
			Console.WriteLine( dir_top );

			// 対象のディレクトリ配下に格納されている *.cs ファイルをすべて列挙する.
			String ptn = "*.cs";
			SearchOption sop = SearchOption.AllDirectories;
			String [] files = Directory.GetFiles( dir_top, ptn, sop );

			if ( files.Length == 0 )
			{

				Console.WriteLine( "対象の cs ファイルはありませんでした." );
				return -1; // ビルドをしない.

			}
			else
			{

				// なんとなくソートしてみる.
				Array.Sort( files );

				Console.WriteLine( "下記が存在する全ての cs ファイルです." );

				// 格納されているファイルをすべてコンソールに出力する.
				for ( int k = 0; k < files.Length; k++ )
				{
					Console.WriteLine( $"{files[k]}" );
				}

				// ビルドに突入する.
				return 0;

			}


		}
	}
}

ビルド前イベントの実行スクリプトを下記に示します。マクロ変数 $(ProjectDir) と相対パスを結合して引数に与えることが可能です。もちろん絶対パスとして指定してもかまいません。

echo プリビルドスクリプトを開始します.
call "$(ProjectDir)tool.exe" "$(ProjectDir)../../mylib/"
echo プリビルドスクリプトが完了しました.

下記が VisualStudio の出力ウインドウです。

リビルドを開始しました...
1>------ すべてのリビルド開始: プロジェクト:aaa, 構成: Debug Any CPU ------
1>  プリビルドスクリプトを開始します.
1>  下記のディレクトリ配下を検索します.
1>  C:\tmp\mylib\
1>  下記が存在する全ての cs ファイルです.
1>  C:\tmp\mylib\lib100\lib100.cs
1>  C:\tmp\mylib\lib200\lib200.cs
1>  C:\tmp\mylib\lib200\lib201.cs
1>  C:\tmp\mylib\lib300\lib300.cs
1>  C:\tmp\mylib\lib300\lib301.cs
1>  C:\tmp\mylib\lib300\lib302.cs
1>  プリビルドスクリプトが完了しました.
1>  aaa -> C:\tmp\sss\aaa\bin\Debug\aaa.exe
========== すべて再構築: 1 正常終了、0 失敗、0 スキップ ==========
========== リビルド は 10:47 に開始され、00.923 秒 かかりました ==========

引数にありえない場所のディレクトリパスを指定すると tool.exe は return -1; するのでビルド開始しません。こちらもあわせて試してみてください。