Разные NuGet пакет(ы) для Debug и Release конфигураций в проекте - как?
От: Mazenrab Россия http://www.electrica.ru
Дата: 24.10.16 15:26
Оценка:
Всем привет!

Имею следующую ситуацию: есть .NET проект (условно назовем Data). Этот проект развивался в рамках одного решения, теперь появилось второе решение в отдельном репзитории которое тоже должно использовать Data. Очевидное решение, как сначала показалось, в зависимости в виде NuGet-пакета. Благо билд-сервер есть, настроить сборки не проблема. И все бы хорошо, но Data зависит от одной нативной dll которая разная в Debug и Release-конфигурациях. И нам соответственно нужно чтобы в разных конфигах бралась соответствующая для каждого из решений.
В рамках одного решения мы это реализовываем просто: в Data.csproj воткнуто два <reference> с разными condition и в момент сборки все в шоколаде! А вот с пакетом так сделать нельзя. Конфигурации он не поддерживает насколько я понимаю

Решение думалось в том чтобы сделать два пакета — Debug и Release.
Первая наивная идея была также прописать condition после установки пакета. Но, идея быстро разбилась о суровую реальность — при адейте пакета кондишены затираются нафиг.
Вторая идея была похитрее — при установке пакета писать в xml атрибут c кондишеном. Но и тут ждал удар по печени. После установки пакета *.csproj не меняется! Меняется только в момент билда.
Третьей идеи пока что не возникло

Соответственно если кто сталкивался с похожими задачами поделитесь плз опытом.
nuget конфигураци пакеты
Re: Разные NuGet пакет(ы) для Debug и Release конфигураций в проекте - как?
От: Mr.Delphist  
Дата: 24.10.16 16:19
Оценка: 7 (2)
Здравствуйте, Mazenrab, Вы писали:

M>Имею следующую ситуацию: есть .NET проект (условно назовем Data). Этот проект развивался в рамках одного решения, теперь появилось второе решение в отдельном репзитории которое тоже должно использовать Data. Очевидное решение, как сначала показалось, в зависимости в виде NuGet-пакета. Благо билд-сервер есть, настроить сборки не проблема. И все бы хорошо, но Data зависит от одной нативной dll которая разная в Debug и Release-конфигурациях. И нам соответственно нужно чтобы в разных конфигах бралась соответствующая для каждого из решений.

M>В рамках одного решения мы это реализовываем просто: в Data.csproj воткнуто два <reference> с разными condition и в момент сборки все в шоколаде! А вот с пакетом так сделать нельзя. Конфигурации он не поддерживает насколько я понимаю

Совершенно случайно, думал сегодня об этом же в профилактических целях, и нагуглил (но ещё не проверял) что-то типа такого:

http://stackoverflow.com/a/30172491/1964969

You should be able to reference different assemblies based on the current build configuration by using either a PowerShell script or using custom MSBuild targets file. Note that using an MSBuild targets file will work cross platform in MonoDevelop and Xamarin Studio where as a PowerShell script will not.
NuGet allows you to include an MSBuild targets file so you can change what happens at build time. In the MSBuild targets file you can have the references and make them conditional based on the current build configuration.
In the build directory of your NuGet package you add an MSBuild .targets file with the same name as your NuGet package id. You can also have different .targets files for a particular target framework (e.g. Net40) by having it under a Net40 subdirectory if you need to.
build\MyPackageId.targets
Then in the MSBuild .targets file you can do something simple such as have the references conditionally added.

<ItemGroup Condition=" '$(Platform)' == 'x86' ">
    <Reference Include="MyAssembly">
      <HintPath>x86\MyAssembly.dll</HintPath>
    </Reference>
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
    <Reference Include="MyAssembly">
      <HintPath>x64\MyAssembly.dll</HintPath>
    </Reference>
</ItemGroup>

Re[2]: Разные NuGet пакет(ы) для Debug и Release конфигураций в проекте - как?
От: Mazenrab Россия http://www.electrica.ru
Дата: 25.10.16 17:40
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:
MD>Совершенно случайно, думал сегодня об этом же в профилактических целях, и нагуглил (но ещё не проверял) что-то типа такого:

Попробовал, не сработало.
Полез читать и пока вот что нашел:

With NuGet 3.x, targets are not added to the project but are instead made available through the project.lock.json.

http://docs.nuget.org/ndocs/create-packages/creating-a-package#including-msbuild-props-and-targets-in-a-package

Параллельно уже получается в install.ps1 писать кондишн для Refrence, но студия почему-то после прописывания Condition стала визуально дублировать совершенно нетронутые рефренсы.
Re: Разные NuGet пакет(ы) для Debug и Release конфигураций в проекте - как?
От: Mazenrab Россия http://www.electrica.ru
Дата: 26.10.16 13:42
Оценка:
Здравствуйте, Mazenrab, Вы писали:

Продолжаю исследования...

Итак решил я формировать два пакета один Data.dll, и второй Data.Debug.dll для соответствующих конфигов.

Написал соответствующий install.ps1:

param($installPath, $toolsPath, $package, $project)
$project.Save()

$condition = ' ''$(Configuration)'' == ''Release'' '

$packageName = Split-Path $installPath -Leaf

if($packageName -match "Debug")
{
    $condition = ' ''$(Configuration)'' == ''Debug'' '    
}

Write-Host "Set condition: $condition"

Write-Host "Packgage name is: $packageName"

[xml] $xml = Get-Content $project.FullName

foreach( $itemGroup in $xml.Project.ItemGroup) 
{
     foreach( $ref in $itemGroup.Reference) 
     { 
         if($ref.HintPath -match $packageName)
         {
                $attrName = 'Condition'

            $attrib = $ref.OwnerDocument.CreateAttribute($attrName)
            $ref.Attributes.Append($attrib)
            $ref.SetAttribute($attrName, $condition)
         }
     }
}
$xml.Save($project.FullName)
$project.Save()


Ну вариант наверное неоптимальный, я с powershell вообще знаком пару дней и то шапочно что называется, но в целом работает и даже делает то что нужно. Тут бы и возрадоваться, но! Пропускаем очередной удар по ливеру.
Дело в том что в Data.dll лежат модельки активно используемые на вьюхах MVC,а вот razor-компилятор активно непонимает моих танцев со сборками и протестует вплоть до runtime exception:

The type 'User' exists in both 'Data.Debug, Version=1.3.0.44, Culture=neutral, PublicKeyToken=null' and 'Data, Version=1.3.0.4, Culture=neutral, PublicKeyToken=null'

Re: Разные NuGet пакет(ы) для Debug и Release конфигураций в проекте - как?
От: Codechanger Россия  
Дата: 26.10.16 14:38
Оценка:
Здравствуйте, Mazenrab, Вы писали:

M>Всем привет!


M>Имею следующую ситуацию: есть .NET проект (условно назовем Data). Этот проект развивался в рамках одного решения, теперь появилось второе решение в отдельном репзитории которое тоже должно использовать Data. Очевидное решение, как сначала показалось, в зависимости в виде NuGet-пакета. Благо билд-сервер есть, настроить сборки не проблема. И все бы хорошо, но Data зависит от одной нативной dll которая разная в Debug и Release-конфигурациях. И нам соответственно нужно чтобы в разных конфигах бралась соответствующая для каждого из решений.

M>В рамках одного решения мы это реализовываем просто: в Data.csproj воткнуто два <reference> с разными condition и в момент сборки все в шоколаде! А вот с пакетом так сделать нельзя. Конфигурации он не поддерживает насколько я понимаю

M>Решение думалось в том чтобы сделать два пакета — Debug и Release.

M>Первая наивная идея была также прописать condition после установки пакета. Но, идея быстро разбилась о суровую реальность — при адейте пакета кондишены затираются нафиг.
M>Вторая идея была похитрее — при установке пакета писать в xml атрибут c кондишеном. Но и тут ждал удар по печени. После установки пакета *.csproj не меняется! Меняется только в момент билда.
M>Третьей идеи пока что не возникло

M>Соответственно если кто сталкивался с похожими задачами поделитесь плз опытом.



1. В пакете делаются две папки — release и debug(например).
2. Создается props файл в папке lib, который содержит два AfterBuild таргета в зависимости от платформы сборки по копированию ваших нативных дллек из соответствующих папок в output.
3. Profit.

Содержимое props файла примерно такое :

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ContentFiles Include="$(MSBuildThisFileDirectory)\..\bin\**\*.*">
</ContentFiles>
</ItemGroup>
<Target Name="CopyFiles" BeforeTargets="AfterBuild">
<Copy
SourceFiles="@(ContentFiles)"
DestinationFiles="@(ContentFiles->'$(OutDir)\%(RecursiveDir)%(Filename)%(Extension)')"/>
</Target>
</Project>
Re[2]: Разные NuGet пакет(ы) для Debug и Release конфигураций в проекте - как?
От: Mazenrab Россия http://www.electrica.ru
Дата: 01.11.16 12:14
Оценка:
Здравствуйте, Codechanger, Вы писали:

Спасибо, но во-первых у меня не взлетел props, а во-вторых выяснилось что razor вьюхи ничего не знают о conditional refrence. В итоге ввиду отсутствия времени решено было оба проекта держать в одном репозитории с прямой ссылкой.
Re[3]: Разные NuGet пакет(ы) для Debug и Release конфигураций в проекте - как?
От: Codechanger Россия  
Дата: 01.11.16 13:59
Оценка:
M>Спасибо, но во-первых у меня не взлетел props, а во-вторых выяснилось что razor вьюхи ничего не знают о conditional refrence. В итоге ввиду отсутствия времени решено было оба проекта держать в одном репозитории с прямой ссылкой.

1. props должен быть в папке build и называться по имени пакета- тут мой косяк недообъяснил.
2. razor view ссылается на сборку в папке bin веб приложения, как я понимаю. Тут фишка в том, что на билде мы копируем в данную папку ту или иную версию сборки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.