在.NET项目中移动项目文件

时间:2010-07-19 13:01:01

标签: c# visual-studio-2008

这与代码无关,但与IDE有关。我正在开发一个包含大约35个不同项目的.NET解决方案。需要将这些项目重新组织为新的文件夹结构。为什么?因为其中大约10个将被删除,其余的将被分成更多的逻辑单元。 一种方法是创建一个新的解决方案,将项目拖放到Windows资源管理器中的新文件夹树中,然后将它们添加到新的解决方案中。 说实话,这听起来很蠢!

有没有办法将项目从IDE中移到不同的文件夹中?我试图“另存为”项目,但IDE不会接受不同的文件夹。

这很令人生气,但是因为文件夹名称中有一些错误的选择,我现在仍然坚持使用这些名称。

<小时/> 示例:现在我有一个项目主文件夹,其中包含名为“Client”,“Server”,“Business”,“Database”等的子文件夹。在这些子文件夹中,有更多子文件夹,每个子文件夹都是一个三位数字。在每个编号的文件夹中都有一个以某种逻辑方式命名的项目,例如Company.Business.Customers,在此项目中具有额外的逻辑。 问题是并非所有项目都遵循这个命名约定,我认为它已经过时了。 像Company.Business.Customers这样的项目应该只在项目根目录中名为Company.Business.Customers的文件夹中,这样才能更容易识别。该名称已经明确表明它是该项目的业务类。客户端类,业务类以及更多内容中的明确划分需要在解决方案中进行安排,但我希望扁平化文件结构。 (并删除一些过时的项目。)基本上,我不是重构,我只是在清理。 VS2008似乎没有这样的选择,但是......

5 个答案:

答案 0 :(得分:6)

启动notepad.exe并打开.sln文件。然后启动Windows资源管理器,导航到解决方案目录。观察.sln文件内容与解决方案结构的匹配方式。编辑条目,使用资源管理器进行相应的更改。先备份。

答案 1 :(得分:1)

我不认为这里有一个简单的答案。您的主要问题是Visual Studio(或.NET)不关心您是否拥有属于项目中不同根命名空间的类。

因此,如果您有一个名为Project.BusinessObjects的项目和另一个名为Project.DataObjects的项目,则无法阻止您将名为Project.BusinessObjects.User的类放入Project.DataObjects项目中。

如果没有大量的手工工作,我不知道如何做到这一切。如果你使用'命名空间重命名'功能,Resharper将会有相当多的帮助,但你仍然会有很多笨拙的工作。

答案 2 :(得分:1)

另外,请非常警惕与版本控制系统一起执行此操作。您必须非常了解您的版本控制系统,以了解它对这种重大重构的反应。

除此之外,你所描述的并不是那么困难。您必须手动编辑解决方案文件和项目文件,并且可能需要从解决方案中删除项目,并在正确的目录下再次添加项目。

我会做一个备份,然后重构。我认为认为你可以从IDE完成所需的一切是错误的。如果您在使用旧的Visual SourceSafe API的源代码管理系统中从IDE中执行您所描述的内容,那么您将认真地(保证)搞砸了您的绑定,那些API不是用于移动(或重命名,就此而言)以你描述的方式存档。在这种情况下执行此操作的最佳方法是删除所有源代码控制绑定,然后重新添加重组后的解决方案。

这并不困难,你只需准备(做备份)并进行实验,直到你做对了。

答案 3 :(得分:1)

我认为在Visual Studio中没有任何办法可以做到这一点,而@gmagana指出,如果文件受版本控制,那将很难做到。

但是,可以手动完成。

首先创建新的所需文件夹结构 - 暂时忽略.csproj文件和解决方案文件,以及更多您感兴趣的.cs文件到新结构中。

现在,启动Visual Studio,并创建一个新的空项目。如果您有不同类型的项目,则可能需要为每种类型创建一个新的空项目。这将为您留下一个空的.csproj文件,以及一个只包含一个项目的.sln文件。

将空项目文件复制到需要的位置,并根据需要重命名。如果需要,可以编辑它们并更改程序集名称和默认命名空间,或者等到完成后再使用Visual Studio更改设置。

最后,编辑.sln文件,然后删除Project部分。将空的.sln文件复制到您想要的位置,然后在Visual Studio中将其打开。现在,将每个现有项目添加到新解决方案中。

在每个项目中,单击“全部显示”按钮,然后开始包含您已复制到项目结构中的所有文件。解决缺少的依赖项,更改项目的名称空间和程序集名称,并确保代码文件未指定您不需要的名称空间。重复直到完成。

一旦你获得了新的构建解决方案,在Reflector中打开DLL将有助于确保你没有错过代码文件中的任何命名空间声明 - 如果你想要到达如果DLL与命名空间之间存在1-1对应关系,或者甚至确保DLL之间没有命名空间,则Reflector就是你的朋友。

祝你好运。

答案 4 :(得分:0)

我使用以下解决方案来解决我的问题:

  1. 我在一个新文件夹中开始使用一个新的空白解决方案。
  2. 对于每个需要移动的项目,我使用Windows资源管理器在解决方案文件夹中创建一个子文件夹,这次使用正确的名称。
  3. 我将项目从原始位置复制到新文件夹。
  4. 我在新位置添加了所有(移动的)现有项目。
  5. 在解决方案管理器中,我将项目重命名为更好的名称。
  6. 我修复了所有项目的项目属性和其他设置。
  7. 这确实很好地清理了整个项目。然后我将整个项目添加到Vault(版本控制系统),一旦它在VSS中,我再次删除了文件夹(实际上,只是先将其重命名)并从VSS系统中检索回来,因此任何过时的二进制文件和其他垃圾都是也走了 这是很多工作,但结果确切地证明了它需要的东西。