如何防止Visual Studio 2017构建在构建时复制输出目录中的内容文件?

时间:2018-11-27 05:53:34

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

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

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

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

项目布局如下所示:

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版本。

2 个答案:

答案 0 :(得分:0)

在项目文件中,将有对third.party.dll的引用以及其内容条目。内容条目就是将其复制到所需子目录的内容。在VS中,将其设置为“ copy local 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”引入输出的根目录目录。

顺便说一句,通过将第三方程序集放在子文件夹中,您正在与msbuild和.net的默认行为作斗争。您的应用程序将需要一个配置文件,其中设置了您需要维护的探测路径,否则它将无法正常工作。然后,如果其他人添加了一个依赖于“ third.party.dll”的组件,那么您将回到试图从bin文件夹中入侵该组件的位置。除非您有令人信服的理由使用子文件夹,否则请不要这样做-没有它,这是令人头痛的生活。

答案 1 :(得分:0)

我认为您正在尝试解决错误的问题。

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

放置在子文件夹中的任何文件都需要在配置文件中具有相应的探针路径条目。您将必须维护该位置,以便对其他文件夹进行任何更改都将产生额外的维护开销。这将阻碍单元测试和集成测试的自动化测试。

此外,您将需要付出更多的努力来抑制多个目录中存在同一程序集。今后将需要对其进行管理和维护,这将使您反复绊倒。

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

请从刚因为您遇到的所有问题而做了相反工作的人那里拿走它。