前不久我把博客升级到了VS2012的solution,结果bin deploy爆掉了。以前在VS2010里,如果打了SP1补丁的话,对MVC3项目点右键,会多出一个菜单,叫做“Add Deployable Dependencies”, 它会在你的项目文件夹里建一个叫做“_bin_deployableAssemblies”的特殊文件夹,里面放的是MVC3项目的几个dll。在publish的时候会自动拷贝到bin目录里。具体可以参考这篇文章:http://haacked.com/archive/2011/05/25/bin-deploying-asp-net-mvc-3.aspx

image

然而,在VS2012里,这个选项居然木有了。我查阅了官方的说明,说明中居然写着VS2012会自动进行bin deploy。可是我的博客升级以后就再也没自动过。但是,如果用VS2012新建一个MVC3项目,却是可以自动拷贝mvc3的那些DLL的,今天我抽空研究了一下,终于发现其中的奥妙了。其实VS2012做的并不是那么“自动”的bin deploy,它依赖的是nuget的package。原理是把MVC3的dll都作为nuget的package引用,这样在deploy的时候当然就会自动拷贝了。

对于从VS2010升级的旧的solution,大家可以用我的办法来手动升级到VS2012的“bin deploy”。不过首先得确保你的旧MVC3项目也使用了nuget。

1. 用VS2012新建一个.NET4的MVC3项目,然后在资源管理器里打开项目文件夹。

定位到packages文件夹,这里是nuget的所有包。然后把图中的几个文件夹复制到旧项目的相同位置。

image

2.  用文本编辑器打开新项目网站目录下的packages.config以及旧项目的packages.config。

image

把图中选中的这几项东西复制到旧项目的packages.config里,重复的自己merge一下。(这里顺便一起merge了两个新版的membership provider)

image

最后旧项目的packages.config应该包含了你以前所引用的包,及MVC3的几个包,看起来就像是这样:

image

3. 最关键的一部,我们要merge两者的project文件,即两个MVC3项目的.csproj文件。

用文本编辑器打开两者的.csproj文件(看不清点图可以放大)。通过观察可以发现,旧项目引用的位置都是.NET Framework里自带的dll,并没有hint path。而VS2012则把MVC3的dll当作了三方的dll进行引用。

所以我们要做的,就是把相关的几个Reference节点都复制到旧项目的相同位置。但要注意,一定得先删了旧项目csproj文件里的重复项

image

必要的是:

Microsoft.Web.Infrastructure

System.Web.Helpers

System.Web.Mvc

System.Web.Razor

System.Web.WebPages

System.Web.WebPages.Deployment

System.Web.WebPages.Razor

其实就是VS2010里默认拷贝的几个dll。

4. 用VS2012打开手动升级后的项目,全部rebuild一下,如果都能编译成功就应该搞定了。

试试publish,我们的dll都乖乖的拷到bin里去了,碉堡了:

image