答えは単純なバッチファイルを書くよりも複雑です。ほとんどの場合、IIS Expressが起動するまで待ってから、いくつかの機能を実行してから再度IIS Expressプロセスを停止する必要があります。
この最後の段階は、複数のビルドで重複したサイトを開始しないようにするために重要です。エラーや誤解を招く結果を招きます。私たちはまた、プロセスを慎重に管理して、 'press Q to quit'プロンプトが私たちのアプリが継続してコアの機能を実行するのを妨げないようにする必要があります。
ここで私がPhantom.JSを実行するためにC#でコンソールアプリケーション用に書いたコードは、それだけでなく、エラーが発生したシナリオを正常に処理する必要があります。
using System;
using System.Diagnostics;
using System.Threading.Tasks;
internal class Program
{
private static int Main(string[] args)
{
string iisExpressPath = args[0];
string websitePath = args[1];
string websitePort = args[2];
string phantomJSPath = args[3];
string jsControllerPath = args[4];
var startIisTask = StartIis(iisExpressPath, websitePath, websitePort);
Process iisexpress;
try
{
iisexpress = startIisTask.Result;
}
catch (Exception)
{
Console.Write("An error occurred while starting IIS express");
return -1;
}
if (iisexpress != null)
{
var phantomJS = new Process();
phantomJS.StartInfo.FileName = phantomJSPath;
phantomJS.StartInfo.Arguments = jsControllerPath;
phantomJS.StartInfo.UseShellExecute = false;
phantomJS.StartInfo.RedirectStandardOutput = true;
var tcs = new TaskCompletionSource<bool>();
phantomJS.Start();
Task.Run(
() =>
{
string str;
while ((str = phantomJS.StandardOutput.ReadLine()) != null)
{
if (str == "Unable to load the address!")
{
tcs.SetException(new ArgumentException(str));
return;
}
Console.WriteLine(str);
}
tcs.SetResult(true);
});
try
{
var complete = tcs.Task.Result;
}
catch (Exception)
{
phantomJS.Kill();
iisexpress.Kill();
return -1;
}
iisexpress.Kill();
return 0;
}
Console.Write("An error occurred while starting IIS express");
return -1;
}
private static Task<Process> StartIis(string iisExpressPath, string websitePath, string websitePort)
{
var tcs = new TaskCompletionSource<Process>();
var iisexpress = new Process();
iisexpress.StartInfo.FileName = iisExpressPath;
iisexpress.StartInfo.Arguments = string.Format("/path:{0} /port:{1}", websitePath, websitePort);
iisexpress.StartInfo.RedirectStandardOutput = true;
iisexpress.StartInfo.UseShellExecute = false;
iisexpress.EnableRaisingEvents = true;
// Implicit capture is ok here as we are capturing an object we need later.
iisexpress.Exited += IisexpressOnExited(tcs);
iisexpress.Start();
Task.Run(
() =>
{
string str;
while ((str = iisexpress.StandardOutput.ReadLine()) != null)
{
if (str.Contains("IIS Express is running"))
{
iisexpress.Exited -= IisexpressOnExited(tcs);
tcs.SetResult(iisexpress);
}
}
});
return tcs.Task;
}
private static EventHandler IisexpressOnExited(TaskCompletionSource<Process> tcs)
{
return (sender, args) => tcs.TrySetCanceled();
}
}
アプリは、パイプは、それ自身のコンソールにphantom.jsの出力は、あなたは、クライアント側のユニットテストを実行するためにそれを使用することができますので、しかし、同じように簡単にホスティング必要とするかもしれない任意のビルドステップに適合させることができます。あなたはより多くの情報が必要な場合は、IISでチームシティー内からジャスミンのユニットテストを実行する方法についての私の記事を参照してください
は表現:あなたの応答のためのhttp://roysvork.wordpress.com/2013/03/29/running-jasmine-tests-hosted-in-iis-express-as-part-of-a-teamcity-build/
感謝を。私は何かが組み込まれていないかどうか疑問に思っていたが、私はそうは思わない。 –
私はこれが古かったことを知っていますが、私はいくつかの有益なプロセス上の考慮事項でこの答えを以下に展開しました。この質問に将来の訪問者を助けるためにこれを掲示する。 –