Как я совместно использую значение маркировки между несколькими сборками CruiseControl.NET?

Нет, состав не означает вложение. Имело бы смысл иметь вложенный класс, если Вы хотите скрыть его больше в пространстве имен внешнего класса.

Так или иначе, я не вижу практического применения для вложения в Вашем случае. Это сделало бы код тяжелее для чтения (понимают), и это также увеличило бы добавление отступа, которое сделает строки короче и более подверженный разделению.

5
задан Peter Mortensen 26 December 2016 в 18:50
поделиться

2 ответа

Я не смог найти существующее решение, которое бы выполняло то, что мне было нужно, поэтому в итоге я написал собственный этикетировщик CruiseControl.NET.

Вот как это делается:

  1. Создайте новый проект. Он будет использоваться CC.NET в качестве библиотеки подключаемых модулей

  2. . Имя выходной библиотеки DLL должно соответствовать * ccnet. \ *. CruiseControl.plugin *. Перейти к проекту properties и измените "Assembly name" на * ccnet. <вставьте здесь имя> .CruiseControl.plugin *

  3. Добавьте в свой проект ссылки на три сборки, найденные в каталоге установки сервера CC.NET (по умолчанию: C: \ Program Files \ CruiseControl.NET \ server):
    • NetReflector.dll
    • ThoughtWorks.CruiseControl.Core.dll
    • ThoughtWorks.CruiseControl.Remote.dll

  4. Создайте новый открытый класс, например этот:
    using ThoughtWorks.CruiseControl.Core;
    using ThoughtWorks.CruiseControl.Remote;
    
    // это имя этикетировщика, которое будет использоваться в ccnet.config
    [ReflectorType ("customLabeller")]
    открытый класс CustomLabeller: ILabeller
    {
     [ReflectorProperty ("syncronisationFilePath", обязательно = true)]
    публичная строка SyncronisationFilePath {получить; установлен; }
    
     #region ILabeller Members
    
     публичная строка Generate (IIntegrationResult previousResult)
     {
     если (ShouldIncrementLabel (previousResult))
     return IncrementLabel ();
    
     если (previousResult.Status == IntegrationStatus.Unknown)
     вернуть «0»;
    
     return previousResult.Label;
     }
    
     public void Run (результат IIntegrationResult)
     {
     result.Label = Создать (результат);
     }
    
     #endregion
    
     частная строка IncrementLabel ()
     {
     если (! File.Exists (SyncronisationFilePath))
     вернуть «0»;
    
     используя (FileStream fileStream = File.Open (SyncronisationFilePath,
     FileMode.OpenOrCreate,
     FileAccess.ReadWrite,
     FileShare.None))
     {
     // читаем номер последней сборки из файла
     var bytes = новый байт [fileStream.Length];
     fileStream.Read (байты, 0, байты.Длина);
    
     строка rawBuildNumber = Encoding.ASCII.GetString (байты);
    
     // анализируем номер последней сборки
     int previousBuildNumber = int.Parse (rawBuildNumber);
     int newBuildNumber = предыдущийBuildNumber + 1;
    
     // увеличиваем номер сборки и записываем обратно в файл
     bytes = Encoding.ASCII.GetBytes (newBuildNumber.ToString ());
    
     fileStream.Seek (0, SeekOrigin.Begin);
     fileStream.Write (байты, 0, байты.Длина);
    
     return newBuildNumber.ToString ();
     }
     }
    
     private static bool ShouldIncrementLabel (IIntegrationResult previousResult)
     {
     return (previousResult.Status == IntegrationStatus.Success ||
     previousResult.Status == IntegrationStatus.Unknown)
     }
    }
    


  5. Скомпилируйте свой проект и скопируйте DLL в каталог установки сервера CC.NET (по умолчанию: C: \ Program Files \ CruiseControl.NET \ server)

  6. Перезапустите службу CC.NET Windows.

  7. Создайте текстовый файл для сохранить текущий номер сборки

  8. . Добавьте новый этикетировщик в определение вашего проекта в файле ccnet.config:
     
      C: \ Program Files \ CruiseControl.NET \ server \ shared \ buildnumber.txt 
     false 
     
    
    


9
ответ дан 18 December 2019 в 11:57
поделиться

Я столкнулся с той же проблемой, но обнаружил, что при использовании в сочетании с оказался гораздо более простым решением.

Единственная проблема, связанная с использованием stateFileLabeller, заключается в том, что вы не можете указать каталог для файлов состояния в проекте, потому что CruiseControl.NET не найдет его. Я оставил его в каталоге по умолчанию, и он отлично работает.

3
ответ дан 18 December 2019 в 11:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: