65.9K
CodeProject 正在变化。 阅读更多。
Home

创建 ASP.NET MVC 的 Nuget 包所需的一切

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (9投票s)

2013 年 5 月 27 日

CPOL

4分钟阅读

viewsIcon

40131

如何创建 MVC HTML Helper 并将其打包到 Nuget。

引言

Nuget 是一个很棒的插件:它对 .NET 的作用就像 RubyGems 对 Ruby 一样,在一个地方提供了数千种适合各种品味的包。

没有什么比在一个中心存储库中找到您需要的库并将其无缝安装到您的项目中更好的了。嗯,实际上还有更好的事情:发布您的库并使其可供所有开发者使用!

背景

我们将创建一个很棒的 MVC HtmlHelper,了解如何将其打包到 Nuget,最后我们将发布它,以便任何人都可以使用它。本文不侧重于 Helper 的开发,而是围绕创建 Nuget 包所需的步骤。

可编辑的 MVC Helper

我们的 Helper 是 CKEditor 内联编辑功能的包装器,提供对更改内容的持久性。默认设置会在查询字符串附加 ?editablemvc=true 时启用 WYSIWYG 工具栏,通过编辑元素的內容保存到文件存储库。存储库和授权都可以通过 EditableMvcBootstrap 类进行更改。

下图展示了 HtmlHelper 的基本原理,更多信息(Github 和 Nuget 包链接)可以在文章末尾的参考部分找到。

EditableMvcBoostrap 类

Nuget 允许 通过转换文件 对配置文件进行更改,并允许添加/删除源文件。这意味着我们可以轻松地将新类添加到我们的项目中,但我们无法编辑现有类,例如 global.asax.csWebActivator 包克服了这一限制,允许在单独的文件中轻松挂钩到主应用程序事件。在这种情况下,我们希望分别在 Application_Start 的开始和结束添加 Helper 的设置和 js 文件的注册。

[assembly: WebActivatorEx.PreApplicationStartMethod(
      typeof(EditableMvc.Web.EditableMvcBootstrap), "Start")]
[assembly: WebActivatorEx.PostApplicationStartMethod(
      typeof(EditableMvc.Web.EditableMvcBootstrap), "PostStart")]


namespace EditableMvc.Web
{
    public static class EditableMvcBootstrap
    {
        public static void Start()
        {
            //Register a custom repository by implementing IEditableRepository 
            EditableMvcConfig.RegisterRepository = () => 
                   new SimpleFileRepository("~/App_Data");

            //Register the authorization method used
            //to enable/disable editing on the html element
            EditableMvcConfig.RegisterAuthorization = () =>
            {
                var editable = !string.IsNullOrEmpty(
                  HttpContext.Current.Request.QueryString["editablemvc"]);
                if (editable)
                {
                    return Convert.ToBoolean(
                      HttpContext.Current.Request.QueryString["editablemvc"]);
                }
                return false;
            };
       }

        //After App_Start is executed register the bundles
        public static void PostStart()
        {
            BundleTable.Bundles.Add(new ScriptBundle("~/bundles/editableMvc").Include(
            "~/Scripts/jquery-ui-{version}.js",
            "~/Scripts/ckeditor/ckeditor.js",
            "~/Scripts/ckeditor/plugins/editablemvcsave/editablemvcsave.js",
            "~/Scripts/editablemvc.js"));
        }
    }
}

创建包

创建一个空的类库并命名为您想要的 Nuget 名称。请记住,如果存在任何已编译的文件,项目中的 DLL 需要包含在包中。我们不想编译 MVC 项目自带的默认文件(如路由、控制器等),因此选择使用空类库作为 nuget 包的目标。所需文件将从 MVC 项目(包含工作 Helper)复制到类库。

复制文件

让我们将要部署到用户项目的文件添加到类库中。请注意,bootstrap 类位于 App_Start 文件夹中:如果该文件夹不存在,Nuget 将在目标项目中创建它,或者如果找到该文件夹,它将仅将文件添加到现有文件夹中。

转换文件

虽然我们不能覆盖或删除现有文件,但我们可以转换我们正在部署的文件:将源文件的文件扩展名从 .cs 更改为 .cs.pp,然后开始使用任何项目属性来更改文件的输出。然后可以使用以下方法更改命名空间:

namespace $rootnamespace$.Controllers {} 

使用 Nuget Package Explorer 创建包

虽然可以使用程序包管理器控制台创建包,但拥有 GUI 会有所帮助,因此让我们下载 Nuget Package Explorer

与创建 MSI 包类似,该工具允许将可部署的资源拖到 **content 文件夹** 中,并将所需的依赖项(如果需要,例如项目 DLL)拖到 **lib 文件夹** 中。

通过编辑包元数据可以添加其他依赖项,例如外部包或 .NET 程序集。

<dependencies>
	<group targetFramework=".NETFramework4.5">
		<dependency id="WebActivatorEx" version="2.0.1" />
	</group>
</dependencies>
<frameworkAssemblies>
	<frameworkAssembly 
	  assemblyName="System.Runtime.Serialization" 
	  targetFramework="" />
</frameworkAssemblies>   

包元数据

有关您包的信息包含在清单文件 *.nuspec 中,并在发布过程中用于(以及诸如库名称、作者等信息)标识包的版本。不允许您覆盖现有库版本,这是为了避免破坏使用该版本的代码,只能发布程序集的新版本。

 

发布包

Nuget 网站 上注册并获取您的 API 密钥。使用它从包管理器中发布包。最后,在 Nuget 网站上检查该包是否已列在您的包列表中。

关注点

发布 Nuget 包是一个简单的过程,这主要是因为包管理器强制我们遵循的规则很少:我们只能向现有项目添加文件或修改其配置文件。我们看到了如何轻松挂钩到宿主应用程序的主事件而不必更改现有文件,最后我们使用 Nuget Package Explorer 工具创建并发布了一个包。

参考文献

本文的源代码可以在 这里 找到,而 Helper 的 Nuget 包可以 这里 下载。

Helper 的实际运行视频可以在 这里 找到。

© . All rights reserved.