#c# #cruisecontrol.net #nant
#c# #cruisecontrol.net #nant
Вопрос:
К сожалению, мои знания о материалах NANT очень ограничены, но сегодня я приступил к обновлению нашей сборки для запуска некоторого кода. Мы используем cruisecontrol.
Это работает нормально — однако мне нужно обработать две папки, поэтому я пытался поместить общий код в традиционный метод 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>
Вместо того, чтобы повторять весь код — я попытался добавить статический класс с методом для выполнения всей обработки, чтобы main передавал только два пути. Но при запуске сборки на сервере (есть ли способ для меня «скомпилировать» это локально ??) произошла ошибка.
Это код, в котором произошла ошибка — я не уверен, пропустил ли я простую синтаксическую ошибку (я пытался скопировать и вставить код в 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 и перечитал сообщение об ошибке — на этот раз поняв, что оно пыталось мне сказать. Оказывается, мне нужно было передать моему новому методу параметр Project. 🙂
Есть ли способ скомпилировать код без необходимости запускать сборку для поиска подобных ошибок? Я попытался вставить его в Visual Studio, но поскольку у меня не было ссылки на библиотеку Nant, это не выделяло ошибку эффективно. Или есть что-то, что вы можете загрузить и установить на компьютер разработчика, чтобы ссылаться на соответствующие библиотеки DLL?
Ответ №1:
Перейдите в командную строку, перейдите к папке, в которой вы установили NANT, и введите команду сборки NANT вручную, например:
nant -f:MyBuildFile.build
Таким образом, вы увидите ошибки, и мы сможем помочь в дальнейшем.
Комментарии:
1. Отличается ли это от запуска из cctray? (или вы предлагали, чтобы я мог протестировать это локально именно так? хотя у меня установлен nant только на сервере)
2. Nant имеет действительно простую установку (в основном, просто копирует ячейки в папку), я не понимаю, почему бы вам не установить его на клиенте для целей отладки. Это инструмент командной строки, вам не нужно ссылаться на него из Visual Studio, просто запустите его в cmd и увидите ошибки по мере их появления (другой способ — просмотреть журналы сервера сборки, но люди, как правило, этого не делают :))
3. И чтобы ответить: нет, я не ожидаю, что он будет отличаться от cctray (я не проверял, но cctray, вероятно, запускает его с некоторыми дополнительными параметрами для перенаправления в свой пользовательский журнал, но ничего, что влияет на способ выполнения)
4. Cool рассмотрит возможность загрузки его локально — затем мне нужно выяснить, какая версия у нас на сервере (если это имеет значение). Поскольку среда разработки была настроена для меня локально (без Nant) Мне не пришлось беспокоиться о добавлении чего-либо. Я бы все же предпочел иметь возможность «компилировать» свой код для поиска синтаксических ошибок без необходимости запускать сборку. В основном из-за того, что в текущей сборке регистрируется так много (не относящихся к делу) ошибок, иногда бывает сложно найти недавно введенные. 🙂 Спасибо за вашу помощь!
Ответ №2:
Перечитывая журналы ошибок, я нашел ответ в стене красного текста.
Оказывается, мне нужно было передать моему новому методу параметр Project (поскольку я имел в виду свойства проекта).
Итак, проблема решена!