22

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

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

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

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

4

4 回答 4

23

我试过了,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 正确显示了我的自定义项组名称。

于 2011-05-06T21:46:20.417 回答
10

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

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

在 .csproj 中包含项目锥之外的内容文件

于 2017-03-29T17:41:39.310 回答
1

这种方法有效

如果您需要将特定文件/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>
于 2019-07-11T12:30:07.543 回答
0

在 SDK 风格的 csproj 中,您可以编写如下内容:

  <Target Name="CopyFilesTargetName" AfterTargets="Build">
    <Copy SourceFiles="$(OutDir)\dlls\Some.dll;$(OutDir)\dlls\SomeOther.dll" DestinationFolder="$(OutDir)" />
  </Target>

您也可以使用<Move而不是<Copy移动文件

于 2021-09-24T14:18:37.023 回答