MSBuild项目文件:将项目复制到输出目录中的特定位置

时间:2011-05-06 18:34:48

标签: msbuild csproj

在清理我继承的项目的文件夹/文件结构的过程中,我遇到了组织所需外部库的问题。我想将它们保存在自己的.\dll\文件夹中,但它们不会被正确复制到构建目录中。它们应该位于根构建目录中,但它们将被移动到子文件夹中。

我的.csproj文件包含以下xml:

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

然后,在构建时,libraryA.dll文件被复制到bin\Debug\dll\文件夹,但我希望它在bin\Debug\文件夹中。

3 个答案:

答案 0 :(得分:15)

我试过这个并且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的一部分执行的目标列表中。

此示例复制无项目组中的所有项目。您可以创建自己的项目组(例如MyFiles),如果您有其他“无”复制文件,则可以对该项目组进行复制。当我尝试这个时,我不得不通过直接编辑csproj文件来更改项目组名称。 Visual Studio不允许我从UI设置文件的项目组,但在我编辑csproj并更改它之后,Visual Studio正确显示了我的自定义项目组名称。

答案 1 :(得分:5)

如果您只想为一个文件更改它,则可能更容易使用该属性:

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

Including content files in .csproj that are outside the project cone

答案 2 :(得分:0)

此方法有效

如果您需要将特定的文件/ 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>