Страницы

понедельник, 5 сентября 2011 г.

Создание nuget-пакета с помощью UppercuT

  В прошлый раз я рассказывал, как настроить сборку проекта с помощью UppercuT. Продолжая тему, расскажу как настроить создание nuget-пакетов с его помощью.
Для начала надо определиться, какие задачи надо решить при создании пакетов:
  1. Создание пакета Solyutor.EventPublisher
  2. Создание пакета Solyutor.EventPublisher.Windsor, зависящего от Solyutor.EventPublisher и Castle.Windsor.
  Итак, создание пакета начинается с создание nuspec-файла. Согласно соглашениям UppercuT, nuspec файлы должны быть в папке SolutionFolder\nuget. Там же есть и nuspec-шаблон, заполнить который не составляет труда:
<?xml version="1.0"?>
<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <metadata>
    <id>Solyutor.EventPublisher</id>
    <version>DO_NOT_EDIT</version>
    <authors>Jury Soldatenkov</authors>
    <owners>Jury Soldatenkov</owners>
    <summary>Simple extensible event aggregator for net.</summary>
    <description>Simple extensible event aggregator for net.</description>
    <projectUrl>https://github.com/solyutor/Solyutor.EventPublisher</projectUrl>
  </metadata>
  </package>
  И схожий файл для Solyutor.EventPublisher.Windsor, с прописанными зависимостями на Solyutor.EventPublisher.
<?xml version="1.0"?>
<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <metadata>
    <id>Solyutor.EventPublisher.Windsor</id>
    <version>DO_NOT_EDIT</version>
    <authors>Jury Soldatenkov</authors>
    <owners>Jury Soldatenkov</owners>
    <summary>Castle Windsor extensions for Solyutor.EventPublisher</summary>
    <description>Provides facility that allows transient listeners to handle messages.</description>
    <projectUrl>https://github.com/solyutor/Solyutor.EventPublisher</projectUrl>
    <dependencies>
      <dependency id="Castle.Windsor" version="2.5.3" />
      <dependency id="Solyutor.EventPublisher" version="DO_NOT_EDIT"/>
    </dependencies>
  </metadata>
  </package>
  Версия пакета заполнять необязательно, ее проставит UppercuT. Но на этом этапе поджидала небольшая засада: версия проекта подставлялась правильно, но аттрибут version для зависимости Solyutor.EventPublisher не обновился. Посмотрев файл nugetPrepare.step в папке build обнаружил ответственный за версии nant-код:
<xmlpoke
file="${spec.file}"
xpath="/package/metadata/version"
value="${assembly.version.full}" />
  Чуть поразмыслив над проблемой, дописал в той же задаче простановку версии зависимости из проекта:
<xmlpoke
file="${spec.file}"
xpath="/package/metadata/dependencies/dependency[@id = 'Solyutor.EventPublisher']/@version"
value="${assembly.version.full}" />
  Это скорее хак, чем решение правильное решение проблемы. Но это единственное место, где версия проекта уже есть в виде установленного nant-свойства.
  С версиями разобрались, но в текущем виде Uppercut создаст два nuget-пакета с одинаковым содержанием: все сборки проекта и все сборки сборки Castle.Windsor. А надо бы только необходимое для пакета файлы...
Решение: надо создать две папки для разных проектов, и скопировать в них только необходимые сборки, и соответствующие nuspec-файлы. И здесь на сцену выходят точки расширения UppercuT. Воспользовавшись руководством, создадим файла для nugetPrepare.post.step. Полную версию можно посмотреть на github, а здесь представлю только значимую выдержку:

<property name="dirs.publisher" value="${dirs.drop.nuget}\Publisher"/>
<property name="dirs.publisher.windsor" value="${dirs.drop.nuget}\Publisher.Windsor"/>

<target name="go">
	
  <delete dir="${dirs.publisher}" failonerror="false"/>
  <delete dir="${dirs.publisher.windsor}" failonerror="false"/>
	
  <mkdir dir="${dirs.publisher}" />
  <mkdir dir="${dirs.publisher.windsor}"/>
	
  <copy todir="${dirs.publisher}\lib">
    <fileset basedir="${dirs.drop.nuget}\lib">
      <include name="Solyutor.EventPublisher.dll"/>
      <include name="Solyutor.EventPublisher.pdb"/>
    </fileset>
  </copy>
	
  <copy todir="${dirs.publisher.windsor}\lib">
    <fileset basedir="${dirs.drop.nuget}\lib">
      <include name="Solyutor.EventPublisher.Windsor.dll"/>
      <include name="Solyutor.EventPublisher.Windsor.pdb"/>
    </fileset>
  </copy>
	
  <copy file="${dirs.drop.nuget}\lib\License.txt" todir="${dirs.publisher}"/>
  <copy file="${dirs.drop.nuget}\lib\License.txt" todir="${dirs.publisher.windsor}"/>
	
  <move file="${dirs.drop.nuget}\Solyutor.EventPublisher.nuspec" todir="${dirs.publisher}"/>
  <move file="${dirs.drop.nuget}\Solyutor.EventPublisher.Windsor.nuspec" todir="${dirs.publisher.windsor}"/>

</target>
На этом настройка заканчивается. Можно запускать build.bat, и в папке code_drop/nuget будут два пакета nuget.
  Спасибо UppercuT!

Комментариев нет:

Отправить комментарий