【问题标题】:Copy output binaries to custom path for xproj将输出二进制文件复制到 xproj 的自定义路径
【发布时间】:2018-05-26 14:51:54
【问题描述】:

我有大约 50 个项目的解决方案。 这些项目有 2 个目标框架:netcore1.1 和 .net 4.6。 所有项目均基于 xproj。

所以作为构建结果,我在 bin/$configuration/$targetfw/ 中有二进制文件。 前任就我而言,我在 bin/debug/netcoreapp 和 bin/debug/net462 输出中有二进制文件。

但我也需要在 /bin 目录中保存 bin/debug/net462 内容的副本。

如何通过 project.json 中的脚本或其他 50 个解决方案的其他项目正确地实现它? 如果 git 源代码控制不显示修复,那就太好了。

附:为什么我需要它?因为 VS 代码映射工具直接在 bin 中查找二进制文件

更新。

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>
  <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
  <PropertyGroup Label="Globals">
    <ProjectGuid>9e2d06cb-21aa-4457-ab44-6e67298037e3</ProjectGuid>
    <RootNamespace>SmartDoc.Domain.Document</RootNamespace>
    <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
    <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>
  <PropertyGroup>
    <SchemaVersion>2.0</SchemaVersion>
  </PropertyGroup>
  <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>

【问题讨论】:

    标签: visual-studio asp.net-core msbuild .xproj


    【解决方案1】:

    如何通过 project.json 中的脚本或其他 50 个解决方案的其他项目正确地实现它?如果 git 源代码控制不显示修复,那就太好了。

    您可以添加自定义 MSBuild 任务以将二进制文件从 bin/$configuration/$targetfw/ 复制到 /bin 目录。

    为此,请卸载您的项目,对其进行编辑,在结束标记 &lt;/Project&gt; 之前添加以下代码:

      <ItemGroup>
        <MySourceFiles Include="$(ProjectDir)bin\$(Configuration)\**\$(ProjectName).dll"/>
      </ItemGroup>
    
    
      <Target Name="TestCopy" AfterTargets="Build">
    
        <Message Text ="Copy file to bin folder." Importance="high"></Message>
    
        <Copy
            SourceFiles="@(MySourceFiles)"
            DestinationFolder="$(ProjectDir)bin"
            />
      </Target>
    

    有了这个目标,VS/MSBuild 会将.dll 文件复制到/bin 目录。

    注意:由于我们必须修改项目文件,因此此修复必须对 git 源代码管理可见。

    更新:

    我可以修改 f.ex. Microsoft.DotNet.Props 文件并添加您的修复 瞄准那里?

    是的,你可以。测试后,它工作正常。但我需要解释一下,我们不推荐这种解决方案,因为它可能会影响所有导入了Microsoft.DotNet.targets 的项目。所以大家在使用这个方法的时候,要多加注意,要备份那个Microsoft.DotNet.targets

    希望这会有所帮助。

    【讨论】:

    • 但是不修改每个xproj文件的方法是什么?可能是普通的bat文件还是要修改共享的Microsoft.DotNet.Common.targets文件?
    • @VitalyMosin,据我所知,恐怕您无法使用常见的 bat 文件来完成此操作。因为我们可以使用通配符*.dll 来收集所有二进制文件,但我们不能在目标文件夹中使用通配符*.dll。 Bat 文件无法智能地将二进制文件放入相应的项目 bin 文件夹中。对于 .targets 文件,我们可以使用 .target 文件来完成,但您仍然需要修改每个项目文件以将这个 .target 文件导入到每个项目中。
    • 请看我有问题的更新帖子。我添加了 xproj 内容。我看到有几个进口。我可以修改 f.ex. Microsoft.DotNet.Props 文件并在那里添加您的 Target 修复?没有项目级别的本地更改..
    • 我刚刚尝试实现将您的修复添加到 Microsoft.DotNet.targets 并且...似乎它适用于所有项目!因此,无需在每个项目中进行 50 次修复,也无需考虑如何在本地从 git 隐藏它。我只是不清楚 VS 如何使用这个 Microsoft.DotNet.targets 来构建场景。谢谢!
    • @VitalyMosin,是的,你可以。但是您应该更加注意修改该文件,因为它可能会影响所有已导入 Microsoft.DotNet.targets 的项目。您可以查看我的更新答案以了解详细信息。
    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    相关资源
    最近更新 更多