NuGet импортирует только мой файл .targets в главный проект.

У меня есть несколько проектов в моем решении, все они имеют один и тот же пакет NuGet. Я установил этот пакет NuGet с помощью параметра «Управление пакетами Nuget для решения» в своем меню.

Теперь этот конкретный пакет NuGet имеет файл .targets в моей папке сборки, который импортирует некоторые файлы в сборку.

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

Когда я смотрю в свои файлы .csproject, я вижу следующую разницу:

Проект 1

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="..\packages\NuGetTester.1.0.1\build\NuGetTester.targets" Condition="Exists('..\packages\NuGetTester.1.0.1\build\NuGetTester.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\NuGetTester.1.0.1\build\NuGetTester.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NuGetTester.1.0.1\build\NuGetTester.targets'))" />
  </Target>
</Project>

Проект 2 Во втором проекте нет этих строк.

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Когда я включаю эти строки во второй проект, кажется, все работает. Может кто-нибудь объяснить, почему это происходит только для первого проекта? Могу ли я каким-то образом заставить каждый проект в решении, которое устанавливает этот NuGet, также включать эти строки? Я не могу заставить своих пользователей включать это вручную.

Изменить, это файл .targets.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Content Include="$(MSBuildThisFileDirectory)\Versions\*.sql">
      <Link>App_Data\Versions\%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>

Спасибо


person Kevin Cloet    schedule 27.09.2018    source источник
comment
Вы решаете эту проблему? Любое обновление для этой проблемы на вашей стороне?   -  person Jack Zhai-MSFT    schedule 04.10.2018
comment
@JackZhai-MSFT Я ответил на свой вопрос. Порядок значения не имеет. Похоже, это странный баг.   -  person Kevin Cloet    schedule 05.10.2018


Ответы (2)


Может кто-нибудь объяснить, почему это происходит только для первого проекта? Могу ли я каким-то образом заставить каждый проект в решении, которое устанавливает этот NuGet, также включать эти строки?

Без журнала установки пакета nuget я не мог объяснить, почему это происходит только для первого проекта. Но вы должны убедиться, что вы установили пакет nuget для всех проектов, когда вы устанавливали пакет NuGet с помощью параметра «Manage Nuget Packages for Solution»:

введите здесь описание изображения

Если все флажки отмечены, у вас все еще есть эта проблема, вы должны установить этот пакет отдельно в проблемный проект, а затем проверить журнал установки.

На всякий случай есть обходной путь для этой проблемы. Вы можете создать файл проекта MSBuild с именем Directory.Build.props в той же папке, что и ваше решение с вашим содержимым. Он будет примитивно импортирован во все проекты в иерархии каталогов.

Проверьте этот документ. подробнее.

Надеюсь это поможет.

person Leo Liu-MSFT    schedule 27.09.2018
comment
Спасибо за комментарий, но, похоже, это совсем другая проблема. Я объяснил в своем ответе. - person Kevin Cloet; 05.10.2018

Насколько мне известно, порядок проектов не был проблемой. Проблема появляется только тогда, когда у меня нет файлов в моей целевой (net46) папке в папке сборки.

Как только я поместил случайный файл в целевую папку .NET, файл .targets был импортирован в проект. Или, если я удалил все целевые папки .NET из сборки, она работает как обычно.

Так что просто подведу итог.

  • Папка сборки без целевых папок .NET framework -> Это работает
  • Папка сборки с пустой целевой папкой .NET framework -> Не работает
  • Папка сборки с целевой папкой .NET framework, заполненной одним или несколькими файлами -> Это работает
person Kevin Cloet    schedule 05.10.2018