代码之家  ›  专栏  ›  技术社区  ›  Bryan

如何防止Visual Studio 2005的“clean”命令删除第三方二进制文件?

  •  8
  • Bryan  · 技术社区  · 16 年前

    我正在开发一个SiteCore/ASP.NET项目。今天,我无意中点击了解决方案上下文菜单中的“清理”选项。我花了一段时间才弄明白为什么我的网站被彻底破坏了。结果,Visual Studio继续前进,从\bin目录中删除了几个必需的程序集,这些程序集不是我项目的一部分。

    我怎样才能防止这种情况再次发生?

    奇怪的是,它没有删除所有内容…只有一小把。它留下了许多我的项目没有直接引用的内容。这让我想知道这个功能到底应该做什么?我可以设置某种文件标志吗?所有文件均未设置为只读。如果您对详细信息感兴趣,将删除以下内容:

    网站核心.analytics.dll
    网站核心.client.xml
    刺激软件.base.dll
    刺激器软件.report.dll
    刺激器软件.report.web.dll
    刺激器软件.report.webdesign.dll
    telerik.web.ui.dll文件

    更新 你知道吗…我想我真正感兴趣的是为什么Visual Studio会保留大多数文件,只删除这些特定的文件。

    6 回复  |  直到 16 年前
        1
  •  8
  •   Paul Turner    16 年前

    问题的正确答案将取决于如何引用程序集以及如何将它们包含在项目输出中。

    这个 bin obj 由项目生成的文件夹最好被视为“输出”文件夹;这些文件夹应该只包含由项目生成生成的文件。

    执行项目清理或重建时,将从这些文件夹中删除所有中间文件和已编译文件。

    你应该感到舒服。

    您应该能够通过随时运行生成过程来还原这些文件夹。如果您已经直接向这些文件夹添加了文件,那么它会破坏这些文件夹的用途,意味着您应该重新考虑如何添加这些文件。

    引用已编译程序集的首选方法是将它们添加到源文件夹中的某个位置。从那里,它们可以像任何其他文件一样容易地添加到源代码管理系统中,并且可以被依赖它们的项目引用/复制。在我的工作中,我们有一个“libraries”文件夹,其中包含许多由我们的解决方案层次结构中的多个项目引用的第三方程序集。

    尝试使用这样的源代码树,看看它是否适用于您:

    • /项目/我的解决方案/
    • /项目/我的解决方案/库/
    • /项目/我的解决方案/项目A/
    • /项目/我的解决方案/项目B/
        2
  •  5
  •   pbering    16 年前

    我们总是在包含SiteCore的项目文件中添加一个后期生成事件。

    <Target Name="AfterBuild">
        <CreateItem Include="$(SolutionDir)\Third Party\Sitecore\*.*">
          <Output TaskParameter="Include" ItemName="FilesToArchive" />
        </CreateItem>
        <Copy SourceFiles="@(FilesToArchive)" DestinationFolder="$(TargetDir)\%(FilesToArchive.RecursiveDir)" />
      </Target>
    

    其中createItem include是放置SiteCore二进制文件的路径。

        3
  •  5
  •   skolima    16 年前

    将DLL放在另一个目录中。您可能不希望它们作为项目的一部分。从新目录引用DLL。编译时,DLL将被复制到bin目录。

    因为这个原因,我处理了很多项目,并在我的项目根目录中保留了一个bin目录来存储第三方DLL。

    目录结构示例:

    MyProjects
     - bin
       - 3rdParty.dll
     - Project1
     - Project2
     - ProjectN
    

    这允许所有项目都具有第三方DLL的已知引用位置,而无需将DLL复制到每个项目中。

    如果您在一个团队中工作,那么您应该就代码的标准目录结构达成一致。这不仅可以减轻你的头痛。

        4
  •  4
  •   Alex de Groot    16 年前

    对于SiteCore,只需确保设置引用的属性(SiteCore.Kernel、SiteCore.Client等): '复制本地'=假。

        5
  •  1
  •   Robert Harvey    16 年前

    我相信,如果将这些文件放在bin以外的子目录中,Visual Studio将不会删除它们。您仍然可以将新的子目录作为部署的一部分。

        6
  •  0
  •   Bryan    16 年前

    嗯,我要继续回答我自己的问题,因为这似乎是迄今为止最简单的答案。我将相关程序集标记为只读。现在他们还没洗干净。

    仍然想知道为什么其他大多数不会被删除。