Visual Studioを使わずコンソールベースでC#のプログラミングをしています。
プログラミングの学習のため色々なプログラムを作成するのですが、新しいプログラムを作成するにあたり、プログラム用のディレクトリを作成し、ひな型となるソースファイルと.csprojファイルをコピーをしています。
大した手間では無いはずなのですが、この繰り返し作業がこれからプログラミングをする私のやる気をそいでしまいます。
という理由で、C#のプロジェクトを作るPowershellを作ってみました。
完全な野良スクリプトですので他のいかなる開発環境のプロジェクトとの互換性は無いはずです。
スクリプト名:MakeCsProject.ps1
<#
.SYNOPSIS
.csprojを作成します。
.LINK
http://maywork.net/
#>
param(
[string]$ProjectName = "consoleapp",
[string]$Target = "exe",
[string]$OutDir = (Resolve-Path(".")).Path
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "STOP"
function MakeNewCsProject
{
param(
[string]
$projectname,
[string]
$target,
[string]
$outdir
)
$cspoj_temp = @'
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AssemblyName></AssemblyName>
<OutputPath>Bin\</OutputPath>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
</PropertyGroup>
<ItemGroup>
<Compile Include="*.cs"/>
</ItemGroup>
<Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
<MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
<Csc Sources="@(Compile)" TargetType="" OutputAssembly="$(OutputPath)$(AssemblyName).exe"/>
</Target>
<Target Name="Clean" >
<Delete Files="$(OutputPath)$(AssemblyName).exe" />
</Target>
<Target Name="Rebuild" DependsOnTargets="Clean;Build" />
<Target Name="Run" DependsOnTargets="Rebuild">
<Exec Command="$(OutputPath)$(AssemblyName).exe" />
</Target>
</Project>
'@
# プロジェクト用ディレクトリの作成
$projdir = Join-Path $outdir $projectname
if (-not(Test-Path($projdir))) {
mkdir $projdir | Out-Null
}
# csprojの作成
$local = Join-Path $projdir ("{0}.csproj" -f $projectname)
$xml = [xml]$cspoj_temp
$xml.Project.PropertyGroup.AssemblyName = $projectname
$xml.Project.Target | ? {$_.Name -eq "Build"} | % {
$_.Csc.TargetType = $Target
}
$xml.Save($local)
# アプリケーションのソースファイルを作成
$consol_app_temp = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ${projectname}
{
class Program
{
// アプリケーションのエントリポイント
static void Main(string[] args)
{
Console.Write("${projectname}");
}
}
}
"@
$form_app_temp = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
namespace ${projectname}
{
class Program
{
// アプリケーションのエントリポイント
[STAThread]
static void Main(string[] args)
{
Form form = new Form1();
Application.Run(form);
}
}
}
"@
$form_form_temp = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
namespace ${projectname}
{
class Form1 : Form
{
// コンストラクタ
public Form1()
{
this.Load += Form1_Load;
}
// Loadイベント
private void Form1_Load(object sender, EventArgs e)
{
// タイトルをセット
this.Text = "${projectname}";
}
}
}
"@
$source_path = Join-Path $projdir ("{0}.cs" -f $projectname)
if ($Target -eq "exe") {
$source = $consol_app_temp
$source | Out-File $source_path -Encoding default
}
if ($Target -eq "winexe") {
$source = $form_app_temp
$source | Out-File $source_path -Encoding default
$source_path = Join-Path $projdir "From1.cs"
$source = $form_form_temp
$source | Out-File $source_path -Encoding default
}
}
MakeNewCsProject $ProjectName $Target $OutDir
やっていることは、プロジェクト用のディレクトリを作って引数を雛形に当てはめてソースファイルや.cspojを出力しているだけです。
作れるプロジェクトはコンソールアプリとフォームアプリの2種類のみ。(それ以外は作ったことが無いので。)
コンソールアプリのプロジェクト作成例
PS>.\MakeNewCsProject.ps1 -ProjectName 「プロジェクト名」 -Target exe -OutDir 「出力先のディレクトリ」
フォームアプリのプロジェクト作成例
PS>.\MakeNewCsProject.ps1 -ProjectName 「プロジェクト名」 -Target winexe -OutDir 「出力先のディレクトリ」
使い捨てスクリプトにしてももう少し気のきいた書き方が出来るようになりたい今日この頃。
コメント