部分内容参考自:
http://dev.csdn.net/article/21/21714.shtm
过程如下:
1,建立解决方案文件夹DEMO
2.建立空白解决方案DEMO
3.建立新的WEB根应用程序项目http://localhost:8040
4.建立虚拟目录WEB应用程序http://localhost:8040/modules删除掉其中的WEB.CONFIG和GLOBAL.ASAX
5,建立虚拟目录WEB应用程序http://localhost:8040/Controls删除掉其中的WEB.CONFIG和GLOBAL.ASAX
6.在解决方案文件夹下建立一个空白文件夹:Build,在其下建立文件夹BIN,我们将会在编译后,将WEB根应用程序项目中的所有ASPX,ASCX以及web.config和global.asax文件复制到BUILD下,把DLL文件复制到BIN下
另外,上面建立的WEB虚拟目录应用程序将会被VS自动标记为应用程序,这是没必要的,我们可以在IIS将其删除(是删除应用程序)
经过以上步骤,我们可以将一个WEB项目分拆为了一个根项目和若干个子模块项目,但是,问题也出现了,那就是布署的问题,我们怎样将每个项目中的ASPX,ASCX文件和DLL文件快速的复制到最终的BUILD文件夹中而保持其结构呢?
我们可以使用VS.NET的生成后事件,这个部分是我在研究Cuyahoga项目时发现的,因为WEB项目没有生成后事件和预生成事件,所以,给布署带来困难,而Cuyahoga的解决方法是修改WEB项目的定义文件*.csproj,将其中项目的类型由WEB改为Local,同时,删除VS.NET自动生成的*.csproj.webinfo文件,然后,单独打开该项目,VS.NET会将其识别为本地项目而非WEB项目,并且,VS.NET也会为其生成*.csproj.user文件,最后,打开解决方案的定义文件,将其中对应该WEB项目的地址由http方式直接改为相对于解决方案定义文件的路径,如此类推,更改完所有的WEB项目文件后,再打开解决方案,你就会发现,WEB项目已经变为本地项目了,这时,整个解决方案交给客户时,客户就算没有按WEB项目特有的方式去创建WEB应用程序,也能打开并编译,并且Cuyahoga这样做的另一个目的是要实现布署的自动化,cuyahoga是一个模块化的项目,其中的ASCX都是以模块出现的,如果使用WEB项目,那么这些WEB模块就无法自动复制到布署目标文件夹,而改造成本地项目后,就可以利用生成后事件进行复制了
(上面的操作中注意,当你把WEB项目改为LOCAL后,应立即删掉*.csproj.webinfo文件,同时,这时不要急于打开总的解决方案文件,否则会提示错误信息,应该立即单独打开该项目,然后直接退出,这时VS会自动生成LOCAL项目对应的*.csproj.user文件,接着,打开总的解决方案文件去修改此项目的对应路径即可)
开始,我以为Cuyahoga的解决方法是最好的,但是,后来,我发现,打开他的解决方案,如果你想自己加入一个用户控件模块时,由于该模块已经改为LOCAL,所以VS.NET根本不允许你建立与WEBFORM相关的文件
又继续研究,发现,其实WEB项目也可以有预生成事件和生成后事件,只不过,VS.NET不会将它们显示出来罢了,因此,我们无需将WEB模块项目转成LOCAL,也可以利用生成后事件,将模块布署到最终的发布文件夹去,方法如下:
1,打开WEB模块项目的文件夹,找到项目定义文件
2.打开项目定义文件,复制以下内容到其中的PostBuildEven值中,这个属性的内容就是生成后事件命令了:
copy *.dll $(SolutionDir)build\bin /y
if not exist $(SolutionDir)build\$(ProjectName) md $(SolutionDir)build\$(ProjectName) 
 del $(SolutionDir)build\$(ProjectName)\*.aspx 
 copy $(ProjectDir)*.aspx $(SolutionDir)build\$(ProjectName)
上面的命令需要解释一下:
copy *.dll $(SolutionDir)build\bin /y
这个命令的作用是将项目文件夹下所有.DLL文件复制到解决方案文件夹(宏$(SolutionDir))的build\BIN文件夹下,并且,如果文件存在,则自动覆盖


这两个字符是VS.NET生成后事件中的换行符,必须在每一行命令后加上
if not exist $(SolutionDir)build\$(ProjectName) md $(SolutionDir)build\$(ProjectName)
这个命令是用于在build目录中为项目建立建立文件夹,用到了if 命令,宏$(ProjectName) 代表项目名,比如项目名为Controls,则目标文件夹中不存在Controls时,会自动建立该文件夹
del $(SolutionDir)build\$(ProjectName)\*.aspx
这个命令将目标文件夹中项目文件夹下的ASPX文件删除掉,目的是保持目标目录项目文件夹是干净的
copy $(ProjectDir)*.aspx $(SolutionDir)build\$(ProjectName)
最后,上面的命令将项目文件夹下所有ASPX文件复制到目标文件夹下的项目文件夹中
需要提醒的是上面使用的一些宏,像$(ProjectDir)本身生成的路径中带有末尾\分隔符,因此,无需再添加\
每一个WEB模块项目均可以使用上面的生成后事件来进行布署,当然,我上面没有处现ASCX的复制
编译后,BUILD文件夹下就有了一份结构正确的并且仅包含网站运行所需文件的内容了
这就是我的心得,下面是一个示例站点:
点击下载
要运行此范例,请自行建立站点
http://localhost:8040,指向DEMO文件夹