使用自定义文件创建NuGet包

时间:2019-03-25 14:11:55

标签: c# nuget package

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

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

我设法创建了一个包含文件的程序包,但是添加文件时可见,并且可以由用户对其进行编辑。

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

我已经搜索过Google和nuget,但我确实很挣扎。

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

1 个答案:

答案 0 :(得分:0)

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

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

一种选择是使用NuGet对MSBuild .props.targets文件的支持。无需将js和css文件放在NuGet contentcontentFiles目录中,而是将其放在其他位置(也许放在build目录中,因为这是.props和{ {1}}文件必须是),并且您具有MSBuild指令将文件添加到构建中,但是具有.targets属性,因此它不会出现在解决方案资源管理器中。但是,由于文件不会放在项目目录的磁盘上,因此可能会给开发人员带来糟糕的开发经验,因为静态文件处理程序将无法在调试过程中查找/保存文件,并且仅在以下情况下存在:网络应用程序已发布,这与NuGet Visible="false"遇到的问题相同。

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

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

我敢肯定,有创造力的人可以想出更多方法来确保使用您的软件包的人无法编辑您的软件包需要工作的资源,但我还是想请您考虑一下为什么要这样做。它对开发人员使用您的软件包有帮助吗,还是您只是想控制它们?想象一下有人可能会使用您的包裹的不同方式,其中某些方式将与您打算使用包裹的方式不同。您阻止资源编辑的方式是否会使开发人员以他们想要的方式使用您的程序包变得不合理地困难?通过阻止开发人员编辑您的程序包分发的js或css文件,您正试图避免的风险/伤害到底是什么?除了阻止他们编辑文件之外,还有其他方法可以最大程度地降低风险和/或危害?