【问题标题】:Create a NuGet package with custom files使用自定义文件创建 NuGet 包
【发布时间】:2019-08-15 19:27:51
【问题描述】:

我有一些代码将在页面上呈现一些 HTML。该解决方案包含一个包含自定义文件、JS、CSS 等的项目。

我正在尝试创建一个 NuGet 包,将这些文件与 DLL 打包在一起。但是,在将 NuGet 包添加到项目时,我不希望任何 CSS、JS 文件等对用户可见和可编辑。这些文件是基础文件,应该包括在内。如果人们想改变外观,他们会创建自己的样式和 JS 来覆盖包中包含的内容。

我已经设法创建了一个包含文件的包,但是在添加文件时是可见的并且可以由用户编辑。

为此,我知道所有解决方案都会有一个名为 Installer Files 的项目,该项目需要放置 CSS 和 JS。

我已经搜索过 Google 和 nuget,但我真的很挣扎。

任何想法或帮助将不胜感激。

【问题讨论】:

    标签: c# nuget package


    【解决方案1】:

    我将首先要求您询问您为什么要尝试这样做。把自己放在用户的位置上。如果您使用了一个包,想要对其在项目中的工作方式进行小幅修改,但发现您必须创建额外的文件并使用预定义的扩展点并且如果包作者无法进行修改,您会有什么感觉没有提供您想要使用的某种可扩展性?还要考虑到使用 HTTP 1.x,与使 css 或 js 文件稍大一点相比,建立新 TCP/HTTP 连接的时间较长,因此当 Web 应用程序将所有内容捆绑到单个文件中时,最终用户通常会有更好的体验文件,但你的包试图强制应用使用多个 js 和 css 文件。

    如果您仍想阻止使用您的包的开发人员修改您的包中的文件,您将无法使用 NuGet 的 contentcontentFiles 功能。 content,当使用packages.config 引用的包被复制到包安装时的目标项目时使用,开发人员当然可以对其项目目录中的文件进行修改。当项目使用PackageReference 引用包时使用contentFiles。它不会将文件复制到项目目录中,但文件可能仍会出现在解决方案资源管理器中,这使用户可以轻松打开和修改(即使他们没有意识到这会影响计算机上的所有项目/解决方案) ,并且更改不会成为其项目源代码控制的一部分)。由于contentFiles 使用 MSBuild 项目工作,并且 MSBuild 是构建时工具,因此尝试以这种方式分发静态文件(js 和 css)可能会给开发人员带来不好的体验,因为在 ASP.NET 期间这些文件将不可用调试,仅在发布后。

    一种选择是使用 NuGet 对 MSBuild .props.targets 文件的支持。不要将 js 和 css 文件放在 NuGet contentcontentFiles 目录中,而是将其放在其他位置(可能在 build 目录中,因为这是您的 .props.targets 文件必须所在的位置),并且您有 MSBuild 说明将文件添加到构建中,但具有 Visible="false" 属性,因此它不会出现在解决方案资源管理器中。但是,由于文件不会在项目目录中的磁盘上,因此可能会给开发人员带来糟糕的开发体验,因为静态文件处理程序在调试期间将无法找到/提供文件,并且只会在web应用发布了,和NuGetcontentFiles一样的问题。

    另一种选择是不要分发 NuGet 包中的资源。将它们放在您的网站或 CDN 上,然后让您的 HTML 从那里加载它们。开发人员不能修改不在他们控制的服务器上的文件,但是如果他们可以修改您的 HTML 从中加载这些资源的 URL,他们可以将您的 js 和 css 复制到他们的项目中并使用和修改它们。您托管这些文件的网站对使用您的软件包的任何人来说也是一个风险,因为如果 Web 应用程序的网站可以正常工作,但您的 css 和 js 文件无法下载,那么 Web 应用程序可能无法工作。如果您的包对内部企业应用有用,那么如果他们的安全策略是禁止任何外部网络访问,那么您的包可能对他们不起作用。

    另一个选择是将资源嵌入到您的 .NET 程序集中。这意味着您将无法再使用 ASP.NET 的静态文件处理程序。如果您的包还不是某种需要在应用程序启动时注册的中间件或处理程序,那么您需要创建包用户调用的方法,并且您的代码将为您的 css 和 js 添加路由到路由器文件,并提供一个处理程序以在路由匹配时返回相关文件。对于小型静态文件,您可能不关心支持 HTTP 范围请求、If-Modified-Since 和其他浏览器使用的 HTTP 功能,但如果您想“正确”地做事,则需要做大量工作,因为您不希望文件在磁盘上因此可编辑。

    我相信一个有创造力的人可以想出更多的方法来确保使用你的包的人不能编辑你的包需要工作的资源,但我再次要求你想想你为什么要这样做.它是否有助于开发人员使用您的包,或者您只是想控制它们?想象一下某人可能想要使用您的包的不同方式,其中一些方式将与您打算如何使用您的包不同。您阻止资源编辑的方式是否使开发人员难以按照他们想要的方式使用您的包?通过阻止开发人员编辑您的包分发的 js 或 css 文件,您试图避免的风险/危害究竟是什么?除了阻止他们编辑文件之外,还有其他方法可以将风险和/或危害降至最低吗?

    【讨论】:

    • 非常感谢您的意见。同意您的观点并理解用户应该能够编辑该文件。
    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多