答案比編寫一個簡單的批處理文件更復雜,因爲在大多數情況下,您需要等到IIS express啓動,然後執行某些功能,然後再次停止IIS Express過程。
這最後一個階段對於避免啓動具有多個構建的重複站點很重要,這會導致錯誤和誤導結果。我們還需要仔細管理流程,以便「按Q退出」提示不會阻止我們的應用繼續執行並執行其核心功能。
下面是我在C#中爲控制檯應用程序編寫的一些代碼,以運行Phantom.JS,而不僅僅是這樣做,它還應該優雅地處理出現錯誤的場景。
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到它自己的控制檯輸出,使你可以用它來運行客戶端單元測試,但也可以很容易地適應任何構建步驟,可能需要託管。
如果您想了解更多信息,請參見我的有關如何從內部的TeamCity與IIS運行茉莉花單元測試後表示:http://roysvork.wordpress.com/2013/03/29/running-jasmine-tests-hosted-in-iis-express-as-part-of-a-teamcity-build/
感謝您的答覆。我想知道我是否缺少內置的東西,但我猜不是。 – 2012-03-14 16:20:11
我知道這是舊的,但我已經在下面擴展了這個答案,並提供了一些有用的過程注意事項。發佈此信息可以幫助未來的訪問者解決這個問題。 – 2013-03-29 23:39:22