不幸的是,我對NANT的知識非常有限,但今天開始更新我們的構建以運行一些代碼。我們使用巡航控制。nant腳本c#編譯錯誤
這工作正常 - 但我需要處理兩個文件夾,所以試圖將通用代碼放入傳統的C#方法。
<echo message="Ensure only 4 directories in the backup directory"/>
<script language="C#">
<code>
<![CDATA[
public static void ScriptMain(Project project)
{
string path = project.Properties["build.ReleasesShareLocation.BackupParent"];
string [] folders = System.IO.Directory.GetDirectories(path,"*", System.IO.SearchOption.TopDirectoryOnly);
System.Collections.ArrayList dirlist = new System.Collections.ArrayList();
foreach (string folder in folders)
{
dirlist.Add(new System.IO.DirectoryInfo(folder));
}
dirlist.Sort(new DirectoryInfoDateComparer());
dirlist.Reverse();
for (int i = 4; i < dirlist.Count; i++)
{
string foldername = ((System.IO.DirectoryInfo)dirlist[i]).Name;
try
{
((System.IO.DirectoryInfo)dirlist[i]).Delete(true);
project.Log(Level.Info, String.Format("Deleted folder {0}", foldername));
}
catch { project.Log(Level.Warning, String.Format("Unable to delete folder {0}", foldername)); }
}
}
internal class DirectoryInfoDateComparer : System.Collections.IComparer
{
public int Compare(object x, object y)
{
System.IO.DirectoryInfo di1 = (System.IO.DirectoryInfo)x;
System.IO.DirectoryInfo di2 = (System.IO.DirectoryInfo)y;
return di1.CreationTime.CompareTo(di2.CreationTime);
}
}
]]>
</code>
</script>
而不是重複所有的代碼 - 我試圖添加一個靜態類的方法來做所有的處理,使主只傳遞兩個路徑。但在運行服務器上的構建(有沒有辦法讓我「編譯」本地?)它錯了。
這是錯誤的代碼 - 我不確定是否錯過了一個簡單的語法錯誤(我嘗試在Visual Studio中複製和粘貼代碼以確保括號和內容匹配),或者如果有一種不同的方式我需要做的是在NAnt構建..
<echo message="Ensure only 4 directories in the backup directory"/>
<script language="C#">
<code>
<![CDATA[
public static void ScriptMain(Project project)
{
string path = project.Properties["build.ReleasesShareLocation.BackupParent"];
string path2 = project.Properties["build.DeltaScriptFileShareLocation.BackupParent"];
Processor.ProcessFolder(path);
Processor.ProcessFolder(path2);
}
internal static class Processor
{
public static void ProcessFolder(string path)
{
string [] folders = System.IO.Directory.GetDirectories(path,"*", System.IO.SearchOption.TopDirectoryOnly);
System.Collections.ArrayList dirlist = new System.Collections.ArrayList();
foreach (string folder in folders)
{
dirlist.Add(new System.IO.DirectoryInfo(folder));
}
dirlist.Sort(new DirectoryInfoDateComparer());
dirlist.Reverse();
for (int i = 4; i < dirlist.Count; i++)
{
string foldername = ((System.IO.DirectoryInfo)dirlist[i]).Name;
try
{
((System.IO.DirectoryInfo)dirlist[i]).Delete(true);
project.Log(Level.Info, String.Format("Deleted folder {0}", foldername));
}
catch { project.Log(Level.Warning, String.Format("Unable to delete folder {0}", foldername)); }
}
}
}
internal class DirectoryInfoDateComparer : System.Collections.IComparer
{
public int Compare(object x, object y)
{
System.IO.DirectoryInfo di1 = (System.IO.DirectoryInfo)x;
System.IO.DirectoryInfo di2 = (System.IO.DirectoryInfo)y;
return di1.CreationTime.CompareTo(di2.CreationTime);
}
}
]]>
</code>
</script>
感謝任何幫助:)
編輯:
我回去通過CC日誌和重-read t他錯誤信息 - 這次瞭解它試圖告訴我什麼。原來我需要傳遞我的新方法Project參數。 :)
有沒有辦法能夠編譯代碼而無需運行構建來找到像這樣的錯誤?我嘗試將它粘貼到Visual Studio中,但由於我沒有引用Nant庫,所以沒有有效突出顯示錯誤。還是有什麼可以下載並安裝在開發機器上以引用適當的dll?
這與從cctray運行它不同嗎? (或者你是否認爲這是我可以在本地測試的方式?儘管我只能在服務器上安裝它) – Jen 2011-06-01 00:18:59
Nant的安裝非常簡單且非常簡單(基本上,只是將垃圾箱複製到一個文件夾中),我不看看爲什麼你不會將它安裝在客戶端上進行調試。這是一個命令提示工具,您不必從Visual Studio中引用它,但可以在cmd中運行它並查看它們出現時的錯誤(另一種方法是查看構建服務器的日誌,但是人們往往不會這樣做:)) – veljkoz 2011-06-01 07:39:59
並回答:不,我不指望它不像cctray(我沒有檢查,但cctray可能運行一些額外的參數重定向到它的自定義日誌,但沒有影響執行方式) – veljkoz 2011-06-01 07:41:32