用简易的7步来创建一个NuGet 包-外加使用NuGet来把ASP.NET MVC 3整合进现有的Web Forms应用程序中去

[原文发表地址]Creating a NuGet Package in 7 easy steps - Plus using NuGet to integrate ASP.NET MVC 3 into existing Web Forms applications

[原文发表时间] 2011-02-15 02:47 AM

上个月我写了一篇叫做把ASP.NET MVC 3整合进现有的升级后的ASP.NET 4 Web Forms应用程序的博文,在这篇博中我展示了一个需要很多手动操作且非常痛苦的方式来把ASP.NET MVC支持添加到一个现有的ASP.NET WebForms应用程序中去。然后你就会有一个可爱的既是MVC 又是WebForms的混合体。

我的一个读者Yannick说到:

image这个需要大声尖叫召唤NuGet

确实曾是这样,恩,应该说确实还是这样。他说那就是极端枯燥的 NuGet应该能把它们变得简单的工作。因此我做了这件事情。感谢Yannick那直言的评论以使我好投入到行动中去。

install-package AddMvc3ToWebForms

首先是我创建了什么,然后是我是怎么创建的。亲爱的读者,我想要你花些时间并创建你自己的NuGet程序包。

用NuGet把ASP.NET MVC添加至一个ASP.NET WebForms项目里去
步骤0- 到这里找到NuGet 1.1。它大约300k,这只花1秒钟的时间。
步骤一 - 打开Visual Studio 2010并创建一个默认的ASP.NET (WebForms)应用程序

VS2010 Default WebForms App

步骤2-右键点击References并点击Add Library Package Reference.在左侧点击Online,并在右上方的搜索框里输入"WebForms"查找我的头像。是的,我的头像。点击安装。
(或者,打开Package Manager Console并键入 "install-package AddMvc3ToWebForms" 然后等待奇迹的发生。包被存储在NuGet.org 。你也可以这样做。)
步骤2a-核对被添加至你的项目里的东西。

那个HookMeUpNow.cs是什么东西?那是所有路由的东西,我将需要它们去编辑你的 Global.asax.cs。现在你需要自己向Global.asax添加一行代码来使之工作。
步骤3-衔接路由及一切
把Mvc3Utilities.RegisterEverything()添加至Application_Start里。你可以随心地进行重命名。

现在运行它。你可以打开Default.aspx和/Home/About。

WebForms and MVC together in the same app, shown in the browser

步骤4-成果!
太棒了!
我是如何制作我自己的NuGet软件包的,你也能。
步骤0- 去这获得 NuGet.exe 命令行。把它放进Path里或其他地方。
步骤1-为你的新包建一个文件夹,通过命令行运行"nuget spec"

C:\Users\Scott\Desktop\AddMvc3ToWebForms>nuget spec
Created 'Package.nuspec' successfully.
C:\Users\Scott\Desktop\AddMvc3ToWebForms>dir Package.nuspec
Directory of
C:\Users\Scott\Desktop\AddMvc3ToWebForms

02/15/2011 02:23 AM 813Package.nuspec
1 File(s) 813 bytes
现在,我更改了这个文件的名字然后编辑了它

<?xml version="1.0"?>
<package xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
<metadata xmlns="https://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<id>AddMvc3ToWebForms</id>
<version>0.4</version>
<authors>Scott Hanselman</authors>
<owners>Scott Hanselman</owners>
<iconUrl>https://www.hanselman.com/images/nugeticon.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>A totally unsupported way to quickly add ASP.NET MVC 3 support to your WebForms Application. Works on my machine.</description>
<tags>MVC MVC3 ASP.NET WebForms</tags>
</metadata>
</package>

步骤2-向你的Content文件夹里添加内容
因为我想在我的目标Web应用程序中用NuGet包向文件夹中添加一下东西,所以我把所有我想要添加的东西放进了一个叫做Content的文件夹内。那里面的所有东西都会在我的目标项目的根目录里显示。这可能是CSS, JS, CS or VB文件,无论什么东西。这些文件都会落入应用了你的软件包的项目里。
在我的项目里,我把从一个MVC应用程序里来的文件夹放进了我的NuGet文件夹结构里。因此有了Content, Controllers, Models, Scripts, Views这些。我把它们从一个现存的空白ASP.NET MVC项目里复制了过来。

步骤3-决定需要预处理什么东西
然而,亲爱的读者,当我的HomeController在你的项目里出现时,我并不想让它在ScottMvcApplication命名空间里。你希望它在MvcApplication54或任何你的项目名称所在的空间。我需要对源文件进行一点点预处理来使用你的项目的上下文,名字,命名空间等。
对于我想要通过NuGet进行自动预处理的文件,我添加了a .pp 后缀名。在我的演示里是HomeController.cs.pp。

然后我向那个软件包添加了几个我想要在安装时被取代的代符。例如$rootnamespace$或$assemblyname$。你可以使用Visual Studio 项目属性NuGet文档

namespace $rootnamespace$.Controllers
{
public class HomeController : Controller
{
//snip
}
}

步骤4-决定需要合并什么XML元素(通常合并进web.config)
接下来常见的预处理是添加元素到web.config中。这是NuGet的一个很不错的小特征,因为你只需要用新元素来建立一个web.config.transform并且它会按所需要的那样自动且无损地添加(并移除)它们。如下是我的web.config.transform供参考。注意这不是一个完整的web.config。这是在我的包中control文件夹里添加的一个web.config。

<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>

<system.web>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages"/>
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

步骤5-添加任何你可能需要的PowerShell脚本,特别是添加引用
基本上完成了。多数的包不会需要很多的PowerShell,但是有些需要。你可以用install.ps1和uninstall.ps1来做许多事情。这些东西在一个靠近Content文件夹的(并不在这里头)、名叫Tools的文件夹里。
这里是我的install.ps1。
注意:目前是没有办法来停止一个正在安装过程中的软件包的,因此如果你试图在NuGet 1.0上安装我的软件包的话,我会警告你并要求你卸载。在将来很可能会有一个预安装或依存检查。如下是检查版本。

param($installPath, $toolsPath, $package, $project)

if ($host.Version.Major -eq 1 -and $host.Version.Minor -lt 1)
{
"NOTICE: This package only works with NuGet 1.1 or above. Please update your NuGet install at https://nuget.codeplex.com. Sorry, but you're now in a weird state. Please 'uninstall-package AddMvc3ToWebForms' now."
}
else
{
$project.Object.References.Add("Microsoft.CSharp");
$project.Object.References.Add("System.Web.Mvc");
$project.Object.References.Add("Microsoft.Web.Infrastructure");
$project.Object.References.Add("System.Web.WebPages");
$project.Object.References.Add("System.Web.Razor");
$project.Object.References.Add("System.ComponentModel.DataAnnotations");
}

注意,在(将来的)NuGet 1.2里我不会需要这些代码。我只需要直接地在我的NuSpec文件里添加引用就可以了。

步骤6-将之打包

返回至命令行并运行nuget pack

C:\Users\Scott\Desktop\AddMvc3ToWebForms>nuget pack
Attempting to build package from 'AddMvc3ToWebForms.nuspec'.
Successfully created package 'C:\Users\Scott\Desktop\AddMvc3ToWebForms\AddMvc3ToWebForms.0.4.nupkg'.

步骤7- 提交你的打包

就是这样。如果你有一个开源库或一些有趣或有用的东西,请在你的博客评论者说你不应该不上传之前把它上传到NuGet。

附:是的我没有算进去步骤0。