[英]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.