我在使用Visual Studio 2017的ASP.NET MVC 5框架顶部有一个用C#
编写的项目。该项目在.NET 4.7.2框架上运行。
我正在尝试使用nuget.exe
为我的项目创建一个程序包,以便可以将其安装到其他项目中。
我有一个名为resources
的文件夹,其中包含.js
和.css
文件,这些文件我不想包含在包中。我希望能够排除整个resources
文件夹。我也不想包含所有视图,只应包含Views/Home
文件夹中的视图。
如何将这些文件排除在打包项目中?
我尝试遵循documentation,在所有视图上添加排除项,然后添加所需的视图。如您所见,以下是我当前的.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:/
答案 0 :(得分:1)
如何排除某些视图和文件夹不包含在已部署的ASP.NET MVC NuGet程序包中?
文件元素属性exclude
是正确的属性,可以将文件从src
位置排除。但是您缺少另一个属性target
:
包中源所在文件夹的相对路径 放置的文件必须以lib,内容,内部版本或工具开头。
查看文档File element attributes,了解更多详细信息。
否则,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项目中以进行测试:
希望这会有所帮助。
答案 1 :(得分:1)
因此,我终于复制了您的问题,并弄清了问题所在。基本上.csproj
会同时查看您的.nuspec
文件和.csproj
文件。它包含项目中标记为Build Action: Content
的{{1}}文件中的所有内容。这就是为什么您的视图显示有趣并且文件未被正确排除的原因。
因此,要解决此问题,您有两种选择。
1)更改项目中的构建动作,以使这些文件不满足要求(只需使用None
)
2)构建.nuspec
文件,使其包含所需的所有文件,例如Leo的答案,然后使用nuget pack projectname.nuspec
构建,仅基于.nuspec
文件打包< / p>
从其他细节中查看此答案