用简易的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=”
http://www.w3.org/2001/XMLSchema xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance>
  <metadata xmlns=”
http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd>
    <id>AddMvc3ToWebForms</id>
    <version>0.4</version>
    <authors>Scott Hanselman</authors>
    <owners>Scott Hanselman</owners>
    <iconUrl>
http://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
http://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 Gallery (beta)并提交你的包。安装向导的步骤并上传nupkg。你也可以获取一个APIKey并使用命令行工具来自动地完成这个过程,或许是作为一个创建过程的一部分。

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

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

Comments (0)

Skip to main content