Пакет NuGet добавляет неверный путь подсказки

Во время автоматической сборки мой пакет nuget не должен зависеть от платформы, однако я продолжаю обнаруживать, что добавляемый пакет nuget неправильно добавляет HintPath.

В моем nuspec я определил файлы, которые являются частью пакета:

<files>
    <file src="lib\xyz.dll" target="lib\xyz.dll" />
    <file src="lib\xyz.xml" target="lib\xyz.xml" />
</files>

Однако всякий раз, когда я добавляю пакет в свой проект/решение, он неправильно добавляет путь подсказки, указывающий:

<Reference Include="xyz, Version=11.0.0.0, Culture=neutral, PublicKeyToken=4a3c0a4c668b48b4">
  <HintPath>..\packages\xyz.11.0.0.0\xyz.dll</HintPath>
  <Private>True</Private>
</Reference>

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

Я просмотрел этот пост (Не удалось добавить пакет NuGet), но я не не нахожу это актуальным. Этот пост (Установка пакета NuGet использует определенную версию сборки в csproj files), казалось, ссылались на ту же проблему, но без ответа. У кого-нибудь есть мысли?


person Randy Walker    schedule 02.08.2016    source источник


Ответы (1)


Это можно обойти, используя пользовательскую задачу MSBuild.

Вместо добавления сборки в каталог lib создайте файл MSBuild .targets с именем, соответствующим идентификатору пакета, и поместите рядом с ним свою сборку xyz.

\build
    \Net45
        \MyPackage.targets
        \xyz.dll
        \xyz.xml

Затем в файле .targets MSBuild добавьте ссылку именно так, как вы хотите. Что-то типа:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Reference Include="xyz">
      <HintPath>$(MSBuildThisFileDirectory)\xyz.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

Выше показано, как указать путь подсказки относительно файла MSBuild .targets. Вы сказали, что хотите использовать путь подсказки, чтобы вы могли удалить его, если xyz.dll может быть каким-то образом разрешен MSBuild, например, в GAC.

person Matt Ward    schedule 02.08.2016
comment
Отлично, позвольте мне попробовать, и я думаю, что это будет победителем - person Randy Walker; 04.08.2016
comment
Помещать ли целевой файл в пакет NuGet? Или я помещаю его в потребляющий проект? - person Randy Walker; 06.08.2016
comment
Поместите его в пакет NuGet в каталог сборки. Затем он будет добавлен в проект при установке пакета NuGet. Существуют пакеты NuGet, использующие настраиваемые целевые объекты MSBuild, такие как Xamarin.Forms и Microsoft.Bcl.Build. Единственное, что бросается в глаза, это то, что файл .targets должен иметь то же имя, что и идентификатор пакета. - person Matt Ward; 06.08.2016