[英]How can I exclude some views and folders from being included into the deployed ASP.NET MVC NuGet package?
我使用Visual Studio 2017在ASP.NET MVC 5框架的顶部用C#
编写了一个项目。该项目在.NET 4.7.2框架上运行。
我正在尝试使用nuget.exe
为我的项目创建一个包,以便我可以将其安装到其他项目中。
我有一个名为resources
的文件夹,其中包含我不希望包含在我的包中的.js
和.css
文件。 我希望能够排除整个resources
文件夹。 我也不想包含我的所有视图,只应包含Views/Home
文件夹中的Views/Home
。
如何排除这些文件包含在我的打包项目中?
我尝试通过在所有视图上添加排除来跟随文档 ,然后添加我想要的那个。 你可以看到Follow是我当前的.nuspec
文件,
<?xml version="1.0"?>
<package >
<metadata>
<id>....</id>
<version>1.0.0</version>
<title>...</title>
<authors>...</authors>
<owners>...</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>...</description>
<releaseNotes></releaseNotes>
<copyright>2019</copyright>
<tags></tags>
</metadata>
<files>
<file src="**\*.*" exclude="**\*.designer.cs;**\*.csproj;**\*.pdb;**\*.user;**\*.vspscc;**\*.nuspec;libman.json;package.json;packages.config;Web.config;ApplicationInsights.config;public\**\*.*;Resource\**\*.*;bin\**\*.*;node_modules\**\*.*;obj\**\*.*;**\*.log;Views\**\*.*"/>
<file src="Views\Home\**\*.cshtml" />
</files>
</package>
更新
我也尝试将相同的规则添加到contentFiles
<?xml version="1.0"?>
<package >
<metadata>
<id>....</id>
<version>1.0.0</version>
<title>...</title>
<authors>...</authors>
<owners>...</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>...</description>
<releaseNotes></releaseNotes>
<copyright>2019</copyright>
<tags></tags>
<contentFiles>
<files include="**\*.*" exclude="**\*.designer.cs;**\*.csproj;**\*.pdb;**\*.user;**\*.vspscc;**\*.nuspec;libman.json;package.json;packages.config;Web.config;ApplicationInsights.config;public\**\*.*;Resource\**\*.*;bin\**\*.*;node_modules\**\*.*;obj\**\*.*;**\*.log;Views\**\*.*"/>
<file include="Views\Home\**\*.cshtml" />
</contentFiles>
</metadata>
<files>
<file src="**\*.*" exclude="**\*.designer.cs;**\*.csproj;**\*.pdb;**\*.user;**\*.vspscc;**\*.nuspec;libman.json;package.json;packages.config;Web.config;ApplicationInsights.config;public\**\*.*;Resource\**\*.*;bin\**\*.*;node_modules\**\*.*;obj\**\*.*;**\*.log;Views\**\*.*"/>
<file src="Views\Home\**\*.cshtml" />
</files>
</package>
但是,当我在不同的项目中安装包时,仍然包含所有视图。
我使用以下命令打包我的包,其中T:/
是我的网络共享
nuget pack -Prop Configuration=Release -OutputDirectory T:/
如何将某些视图和文件夹排除在已部署的ASP.NET MVC NuGet包中?
文件元素属性exclude
是正确的属性,用于从src
位置排除文件。 但你错过了另一个属性target
:
放置源文件的包中文件夹的相对路径,必须以lib,content,build或tools开头。
检查文档文件元素属性以获取更多详细信息。
否则,nuget包在安装包时不知道将文件放到项目的哪个位置。
所以,.nuspec文件应该是这样的:
<files>
<file src="**\*.*" exclude="**\*.designer.cs;**\*.csproj;**\*.pdb;**\*.user;**\*.vspscc;**\*.nuspec;libman.json;package.json;packages.config;Web.config;ApplicationInsights.config;public\**\*.*;Resource\**\*.*;bin\**\*.*;node_modules\**\*.*;obj\**\*.*;**\*.log;Views\**\*.*" target="content\/>
<file src="Views\Home\**\*.cshtml" target="content\Views\Home\" />
</files>
但是这个包会将所有文件添加到已安装项目的根文件夹中。 因为您包含带有通配符**\\*.*
所有文件,Nuget无法智能地将所有这些文件分配到它们应该位于的文件夹中。
要解决此问题,我们应将不同文件夹中的文件定位到不同的文件夹,例如:
<file src="App_Start\*.cs" target="content\App_Start\" />
所以, .nuspec
应该看起来像:
<?xml version="1.0"?>
<package >
<metadata>
<id>TestWebApp</id>
<version>1.0.0</version>
<authors>Tester</authors>
<owners>Tester</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package description</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2019</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
<files>
<file src="App_Start\*.cs" target="content\App_Start\" />
<file src="resources\*.*" target="content\resources\" />
....
<file src="Views\Home\**\*.cshtml" target="content\Views\Home\" />
</files>
</package>
然后打包此.nuspec
文件并将其安装到Console App项目中以进行测试:
希望这可以帮助。
所以我最终复制了你的问题并弄清楚它在做什么。 基本上nuget pack
正在查看.csproj
文件和.nuspec
文件。 它包含项目中标记为Build Action: Content
的.csproj
文件中的所有Build Action: Content
。 这就是为什么您的观点显示有趣并且文件未被正确排除的原因。
所以要修复它你有几个选择。
1)更改项目中的构建操作,使这些文件不是内容(只使用None
)
2)构建.nuspec
文件以包含您需要的所有文件,例如Leo的答案显示,然后使用nuget pack projectname.nuspec
构建,仅基于.nuspec
文件进行.nuspec
从其他一些细节中查看此答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.