ошибка компиляции nant script c #

#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 (поскольку я имел в виду свойства проекта).

Итак, проблема решена!