如何排除某些视图和文件夹,使其不包含在已部署的ASP.NET MVC NuGet程序包中?

时间:2019-02-26 17:15:39

标签: c# visual-studio visual-studio-2017 nuget nuget-package

我在使用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:/

2 个答案:

答案 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项目中以进行测试:

enter image description here

希望这会有所帮助。

答案 1 :(得分:1)

因此,我终于复制了您的问题,并弄清了问题所在。基本上.csproj会同时查看您的.nuspec文件和.csproj文件。它包含项目中标记为Build Action: Content的{​​{1}}文件中的所有内容。这就是为什么您的视图显示有趣并且文件未被正确排除的原因。

因此,要解决此问题,您有两种选择。

1)更改项目中的构建动作,以使这些文件不满足要求(只需使用None

2)构建.nuspec文件,使其包含所需的所有文件,例如Leo的答案,然后使用nuget pack projectname.nuspec构建,仅基于.nuspec文件打包< / p>

从其他细节中查看此答案

NuGet Pack: ignore default includes