Файл проекта MSBuild: копирование элемента в определенное место в выходном каталоге - PullRequest
17 голосов
/ 06 мая 2011

В процессе очистки структуры папок / файлов в проекте, который я унаследовал, я столкнулся с проблемой организации необходимых внешних библиотек. Я хочу сохранить их в своей собственной папке .\dll\, но они не копируются должным образом в каталог сборки. Они должны находиться в корневом каталоге сборки, но вместо этого они перемещаются в подпапку.

Мой .csproj файл содержит следующий xml:

<Project>
  <ItemGroup>
    <None Include="dlls\libraryA.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

Затем при сборке файл libraryA.dll копируется в папку bin\Debug\dll\, но я хочу его в папку bin\Debug\.

Ответы [ 3 ]

17 голосов
/ 07 мая 2011

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

Отредактируйте файл csproj и после этой строки:

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

Добавьте эти строки:

  <PropertyGroup>
    <PrepareForRunDependsOn>$(PrepareForRunDependsOn);MyCopyFilesToOutputDirectory</PrepareForRunDependsOn>
  </PropertyGroup>

  <Target Name="MyCopyFilesToOutputDirectory">
    <Copy SourceFiles="@(None)" DestinationFolder="$(OutDir)" />
  </Target>

Копирование выходных файлов происходит в целевом объекте PrepareForRun.Это добавит вашу собственную цель в список целей, которые выполняются как часть PrepareForRun.

В этом примере копируются все элементы в группе элементов None.Вы можете создать свою собственную группу элементов (например, MyFiles) и сделать копию для этой группы элементов, если у вас есть другие файлы «Нет», которые вы не хотите копировать.Когда я попробовал это, мне пришлось изменить имя группы элементов, отредактировав файл csproj напрямую.Visual Studio не позволяла мне устанавливать группу элементов файла из пользовательского интерфейса, но после того, как я отредактировал csproj и изменил его, Visual Studio правильно отобразил имя моей пользовательской группы элементов.

6 голосов
/ 29 марта 2017

Если вы хотите изменить его только для одного файла, может быть проще использовать свойство:

<None Include="dlls\libraryA.dll">
  <Link>%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

Включая файлы содержимого в .csproj, находящиеся вне конуса проекта

0 голосов
/ 11 июля 2019

Этот подход работает

Если вам нужно принудительно скопировать определенный файл / пакет nuget в основной проект asp.net (2.2), добавьте в конце вашего csproj:

<!-- Force copy MathNet because we need it in compilation -->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="Build">
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll'))" />
</Target>

<ItemGroup>
    <ContentWithTargetPath Include="..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <TargetPath>MathNet.Numerics.dll</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>
...