asp.net-core – 有没有办法将ASP.NET Core应用程序区域打包为NuGet包?

我正在开发一个ASP.NET Core应用程序,我希望将其作为NuGet包发布,您可以将其添加到任何Core Web项目中.该应用程序实际上完全局限于项目中的一个区域(即/ Areas / MyArea),包括控制器,视图,服务类,模型,视图等,除了少数部分.真的,这些是我喜欢神奇地添加到现有网络应用程序的部分:

>该地区及其中的一切
>它的www和JS在wwwroot / lib / myapp中
> Startup类中的条目
>根中的MyApp.json

我知道NuGet会恢复软件包依赖关系,但我不确定它是如何考虑客户端软件包的.

有什么建议? NuGet是错误的工具吗?

最佳答案 目前afaik无法从nuget包中将文件传送到Web应用程序.我认为有一些讨论和工作正在进行中,以便将来实现这一目标.

我在我的项目中处理它的方式是嵌入视图和所需的静态js和css资源,这在project.json中是这样完成的:

“buildOptions”:{
        “embed”:[“Views /”,“js /”,“css / **”]
    },

我创建了一个controller to serve my static resources

public class cscsrController : Controller
{  
    private ContentResult GetContentResult(string resourceName, string contentType)
    {
        var assembly = typeof(cscsrController).GetTypeInfo().Assembly;
        var resourceStream = assembly.GetManifestResourceStream(resourceName);
        string payload;
        using (var reader = new StreamReader(resourceStream, Encoding.UTF8))
        {
            payload = reader.ReadToEnd();
        }

        return new ContentResult
        {
            ContentType = contentType,
            Content = payload,
            StatusCode = 200
        };
    }

    [HttpGet]
    [AllowAnonymous]
    public ContentResult bootstrapdatetimepickercss()
    {
        return GetContentResult(
            "cloudscribe.Core.Web.css.bootstrap-datetimepicker.min.css",
            "text/css");
    }

    [HttpGet]
    [AllowAnonymous]
    public ContentResult momentwithlocalesjs()
    {
        return GetContentResult(
            "cloudscribe.Core.Web.js.moment-with-locales.min.js",
            "text/javascript");
    }

}

然后我链接到我需要加载js和/或css的视图中的控制器操作.

为了使嵌入的视图工作,我创建了一个RazorViewEngineOptions的扩展方法:

public static RazorViewEngineOptions AddEmbeddedViewsForCloudscribeCore(this RazorViewEngineOptions options)
{
    options.FileProviders.Add(new EmbeddedFileProvider(
            typeof(SiteManager).GetTypeInfo().Assembly,
            "cloudscribe.Core.Web"
        ));

    return options;
}

这必须从Web应用程序Startup中的ConfigureServices调用,如下所示:

services.AddMvc()
    .AddRazorOptions(options =>
    {
        options.AddEmbeddedViewsForCloudscribeCore();

    })
    ;

这种技术对于区域应该是相同的.请注意,一个很酷的事情是用户可以下载视图并在本地安装它们,这将覆盖嵌入视图的使用,从而可以轻松自定义部分或全部视图.通过覆盖视图,还可以根据需要在本地手动安装js和css,如果需要自定义,则更改视图以链接到这些本地文件.最终的结果是我的nuget拥有它需要的一切,所以只有一些启动配置才能让事情发挥作用.

点赞