【问题标题】:How do I prevent Visual Studio 2017 build from duplicating content files in output directory on build?如何防止 Visual Studio 2017 构建在构建时复制输出目录中的内容文件?
【发布时间】:2019-04-28 19:56:56
【问题描述】:

我的目标是在保持所需布局的同时防止重复。

所以,我有一个项目(C#/.Net462/VS15-2017),它引用了一些第三方 DLL。出于原因,我发现最好将这些文件与我的应用程序一起打包,并使用指令引用 app.config 中的文件。

出于更多原因,我决定将这些程序集(.dll 文件)作为内容放入我的项目中,以便更新时复制。 p>

项目布局如下所示:

SexyApp                                  <-project
   References
       third.party.dll
   Images                                <-fluff
       sexy.png
   Lib                                   <-folder
       x86Arch                           <-folder
          third.party.dll                <-third party assembly (content, copy when newer)
          ru                             <-localized folder
             third.party.resource.dll    <-resource assembly (content, copy when newer)
   app.config
   sexy.cs

发布输出看起来像这样

bin
   Release
      sexy.exe
      sexy.config
      Images
         sexy.png
      third.party.dll                     <-This seems like a duplicate
      ru                                  <-This seems like a duplicate
         third.party.resource.dll         <-This seems like a duplicate
      Lib                                 <-This is what I want
         x86Arch                          <-This is what I want
            third.party.dll               <-This is what I want
            ru                            <-This is what I want
               third.party.resource.dll   <-This is what I want

期望的输出

bin
   Release
      sexy.exe
      sexy.config
      Images
         sexy.png
      Lib                                    <-This is what I want
         x86Arch                             <-This is what I want
            third.party.dll                  <-This is what I want
            ru                               <-This is what I want
               third.party.resource.dll      <-This is what I want

我的尝试

  • 构建操作无,更新时复制。仍然复制文件。
  • 构建动作内容,请勿复制。将它们复制到错误的位置。
  • DLL 的引用已将本地复制设置为 true。将此设置为 false 不会改变结果。

编辑: 构建路径只是 'bin\Release\' 对 x86 的引用是一个文件夹……第三方程序集的 x86 版本。

【问题讨论】:

  • x86 文件夹在哪里?我没有在 Release 输出和 Desired 输出中看到它。 third.party.dll文件在引用节点下和x86文件夹下是同一个文件吗?您是如何获得这些重复文件的,您是在构建之前清理解决方案还是进行任何其他操作?无法根据您的项目布局重现此问题。如果可能,请与我们分享一个小样本,以便我们重现此问题。
  • MSBuild 使用NoneContent 项目作为ResolveAssemblyReferences 任务的输入,因此如果您引用程序集,它也可能会找到这些项目。您也可以在 Content 项目上设置 Private="false",但如果没有可重现的示例和/或 .csproj 文件,我们可能无法为您提供更多帮助。
  • 抱歉,还是无法重现这个问题,release文件夹下的重复文件third.party.dll,可以将引用copy local设置为false。但是ru文件夹下的重复文件third.party.resource.dll,我无法重现,我身边没有。您真的应该与我们分享一个可重现的示例样本。
  • 这是我发现的以及我如何解决它的。无论我设置什么,它都会复制参考。而且,该软件确实需要这些 dll。但是,我也在复制它们,所以不需要复制它们。我编辑了 csproj 文件,为我想要的 dll 添加了 TARGET COPY SOURCEFILES。然后我在之前的构建空间中做了,仍然将它们复制到一个子目录。然后,MSBuild 停止复制它们(不确定它是否仍然无视设置/建议)。我的收获是,如果它知道它们是需要的,并且不知道它们是以另一种方式被复制的,它可能会复制它们。
  • 还注意到该项目的目标是 .Net 4.6.2,但 MSBuild 日志显示它使用 4.6.1 工具和 4.6.2 工具。这可能是相关的,也可能是一些看不见的魔法。它专门使用 4.6.1 resgen。我希望能够提供样品。这个解决方案有二十几个项目。我想我会有一个远程的人,我可以用其他我还没有移动到子文件夹的 dll 来演示。不确定我是否可以提供一个简单的例子。无论如何,感谢您的回复和欢呼!

标签: visual-studio deployment msbuild visual-studio-2017 project


【解决方案1】:

在项目文件中会有对third.party.dll 的引用以及它的内容条目。内容条目是将其复制到您想要的子目录的内容。在 VS 中将其设置为“复制本地 false”或在记事本中编辑项目文件并将其设置为 false 以供参考。

<Content Include="third.party.dll">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Reference Include="third.party.dll">
  <Private>false</Private>
</Reference>

即使您说您尝试将本地副本设置为 false,我知道它会尊重这一点。无论如何要通过的文件向我建议您有另一个引用“third.party.dll”的组件,并且它被设置为复制本地,因此它将“third.party.dll”引入到输出的根目录给你的目录。

顺便说一句,您通过将第 3 方程序集放在子文件夹中来对抗 msbuild 和 .net 的默认行为。您的应用程序将需要一个配置文件,其中设置了您需要维护的探测路径,否则它将无法工作。然后,如果其他人添加了一个依赖于“third.party.dll”的组件,那么您将回到原点,试图将其从 bin 文件夹中破解。除非您有令人信服的理由使用子文件夹,否则不要使用子文件夹 - 没有它会让人头疼。

【讨论】:

    【解决方案2】:

    我认为你试图解决错误的问题。

    您所要做的就是与 msbuild 的默认行为作斗争,并为您的应用程序增加不必要的复杂性。

    您放置在子文件夹中的任何内容都需要在配置文件中具有相应的探测路径条目。您必须维护这一点,因此添加其他文件夹的任何更改都会产生额外的维护开销。这将阻碍单元和集成测试的自动化测试。

    此外,您将需要付出额外的努力来禁止在多个目录中出现相同的程序集。这需要在未来进行管理和维护,它会反复绊倒你。

    如果您只是接受 bin 文件夹作为所有程序集的最终位置并且不要试图干扰它,那么这就是您可以消除的所有开销。

    从一个刚刚做了与你想做的相反的事情的人那里拿走它,因为它导致了所有问题。

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 2018-07-11
      • 2018-06-02
      • 1970-01-01
      • 2016-10-19
      相关资源
      最近更新 更多