В прошлый раз я рассказывал, как настроить сборку проекта с помощью UppercuT. Продолжая тему, расскажу как настроить создание nuget-пакетов с его помощью.
Для начала надо определиться, какие задачи надо решить при создании пакетов:
С версиями разобрались, но в текущем виде Uppercut создаст два nuget-пакета с одинаковым содержанием: все сборки проекта и все сборки сборки Castle.Windsor. А надо бы только необходимое для пакета файлы...
Решение: надо создать две папки для разных проектов, и скопировать в них только необходимые сборки, и соответствующие nuspec-файлы. И здесь на сцену выходят точки расширения UppercuT. Воспользовавшись руководством, создадим файла для nugetPrepare.post.step. Полную версию можно посмотреть на github, а здесь представлю только значимую выдержку:
Спасибо UppercuT!
Для начала надо определиться, какие задачи надо решить при создании пакетов:
- Создание пакета Solyutor.EventPublisher
- Создание пакета Solyutor.EventPublisher.Windsor, зависящего от Solyutor.EventPublisher и Castle.Windsor.
<?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!
Комментариев нет:
Отправить комментарий