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

时间:2010-02-23 02:48:12

标签: asp.net visual-studio visual-studio-2005 sitecore

我正在开发一个Sitecore / ASP.NET项目。今天在某些时候我无意中点击了解决方案上下文菜单中的“清理”选项。我花了一段时间才弄清楚为什么我的网站被无可救药地打破了。事实证明,Visual Studio继续从\ bin目录中删除了几个不属于我项目的必需程序集。

如何防止再次发生这种情况?

奇怪的是,它并没有删除所有内容......只是少数几个。它留下了很多我的项目没有直接引用的东西。这让我想知道这个功能究竟应该做什么?我可以设置某种文件标志吗?没有文件设置为只读。如果您对细节感兴趣,则删除以下内容:

Sitecore.Analytics.dll
Sitecore.Client.XML
Stimulsoft.Base.dll
Stimulsoft.Report.dll
Stimulsoft.Report.Web.dll
Stimulsoft.Report.WebDesign.dll
Telerik.Web.UI.dll

更新:你知道吗...我想我真正感兴趣的是为什么Visual Studio会丢弃大部分文件而只删除这些特定文件。

6 个答案:

答案 0 :(得分:8)

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

项目生成的binobj文件夹最好被视为“输出”文件夹;这些文件夹应该只包含项目构建生成的文件。

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

你应该感到很自在。

您应该可以通过随时运行构建过程来还原这些文件夹。如果您直接向这些文件夹添加了文件,则会破坏这些文件夹的用途,这意味着您应该重新考虑如何添加这些文件。

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

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

  • / Projects / My Solution /
  • / Projects / My Solution / Libraries /
  • / Projects / My Solution / Project A /
  • / Projects / My Solution / Project B /

答案 1 :(得分:5)

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

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

示例目录结构:

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

这允许所有项目都具有第三方dll的着名参考位置,而无需将dll复制到每个项目中。

如果您正在组建团队,那么您应该就代码的标准目录结构达成一致。除了这一点,这将为您节省许多麻烦。

答案 2 :(得分:5)

我们总是将AfterBuild事件添加到包含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 :(得分:4)

如果是Sitecore,只需确保设置引用的属性(Sitecore.Kernel,Sitecore.Client等): '复制本地'= false。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

好吧,我将继续回答我自己的问题,因为它似乎是迄今为止最简单的答案。我将有问题的程序集标记为只读。现在他们没有得到清理。

仍然想知道为什么大部分其他人都不会被删除。