在.csproj文件中,<无包含=“…”>的用途是什么?


137

怎么

<None Include="C:\foo.bar" />

不同于

<Content Include="C:\foo.bar" />


7
我将Contents更改为Nones。我认为当我将文件从.ascx重命名为.cshtml并转换为Razor时发生了这种情况。手动将其更改回可以解决我遇到的一些部署问题。很高兴我找到了这个。
克里斯,

Answers:


135

有关构建操作属性的MSDN文章解释了这些差异。

-该文件不包括在项目输出组中,并且在构建过程中未进行编译。一个示例是包含文档的文本文件,例如自述文件。

内容 -该文件未编译,但包含在“内容”输出组中。例如,此设置是.htm或其他类型的Web文件的默认值。


5
谢谢,我在查找此参考文献时遇到了麻烦。
Emmett

有用,但是,如果文件不包含在输出中,为什么还要有一个“无”项呢?重点是什么?
JimH44 '18

1
@ JimH44 <None>项目通常用于将文件专门复制到输出目录,即使默认情况下它们不在输出组中也是如此。如果为<无>文件选择“复制到输出目录”->“始终复制”,这将导致它被复制,并且您会看到添加到项目的.csproj文件中的条目将具有<无>条目。用于文件。
出色的编译器,

3
那么,带有“复制到输出目录”->“始终复制”的<无>文件和带有“复制到输出目录”->“始终复制”的<Content>文件之间有什么区别?
哈希表

30

它们的不同之处之一在于它们的发布方式。“无”项不包含在发布中,“内容”项包含在发布中;例如,在“发布”选项卡上的“应用程序文件”对话框上。


8
不对。至少在新的点网CLI中。如果您有一个项目声明为“无”且CopyToOutputDirectory设置了true该项目,则它将在dotnet publish
disklosr

13

我不是100%肯定(我读过Build Action属性的MSDN描述),但是仅将该答案从MSDN复制到StackOverflow并不能完全为我回答问题。

无”和“ 内容 ”的区别仅对Web项目有影响。对于命令行项目,WinForm项目或UnitTest项目(在我的情况下)等。NoneContent没有不同的行为。

MSDN:“项目输出组”或“内容输出组”仅是Web项目中使用的术语,对吗?


2
如您所说,Nonevs Content仅对发布步骤有效,而对构建步骤无效。对于构建步骤,似乎CopyToOutputDirectory可以在其中之一上进行设置,并控制是否通过构建步骤复制文件。默认情况下,T4模板作为Content项目而不是作为项目添加,这似乎也很奇怪None
克里斯托弗·金

8

在我的情况下,我的MSBuild文件具有ItemGroup用于图像资源的,如下所示:

  <ItemGroup>
    <Content Include="Resources\image001.png" />
    <Content Include="Resources\image002.png" />
    <Content Include="Resources\image003.png" />
    <Content Include="Resources\image004.png" />
    <None Include="Resources\image005.png" />
    <None Include="Resources\image006.png" />
    <None Include="Resources\image007.png" />
  </ItemGroup>

当我的项目运行良好时,这让我想知道为什么我的项目中混合了item ContentNoneitem类型的元素ItemGroup。这篇MSDN文章(针对Visual Studio 2010)为我提供了我正在寻找的指导:

请注意,资源编辑器添加图像时,会将Build Action设置为None,因为.resx文件引用该图像文件。在构建时,图像被拉入从.resx文件创建的.resources文件中。然后可以通过为.resx文件自动生成的强类型类轻松访问该图像。因此,您不应将此设置更改为Embedded Resource,因为这样做会在程序集中两次包含映像。

解决方法:在此指导下,使用文本编辑器将Content项目类型元素更改为None

另外,有关MSBuild项目的概述,请参见此MSDN文章


3

我有一个项目,其中不包含可编译的项目(它为茉莉花单元测试存储了html和javascript)。

有一天,我的解决方案(包含所述项目)停止编译,并说“项目中不存在目标“ Build””。

我添加了一个导入以引入编译器,该编译器在我的计算机上运行正常,但在构建服务器上使用msbuild失败。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

然后,我从

<None Include="SpecRunner.html" />

<Content Include="SpecRunner.html" />

它也可以在构建服务器上使用。


2

模板项目文件中需要“无”才能包含在.vstemplate中定义的文件,否则它们会在创建和翻译过程中丢失。它们被放在用于构建所有内容的temp文件夹中,然后不久便被删除。


1

以我为例,.Pubxml是“ 无”列表中的那些文件之一。它并不用于解决方案构建或用于Web项目的静态文件。但是要将站点发布到Azure,配置已存在。

根据Microsoft的文章,这些是我们在.csproj文件标记中看到的主要类型:

无-该文件不包括在项目输出组中,并且在构建过程中未进行编译。一个示例是包含文档的文本文件,例如自述文件。

编译-文件被编译到构建输出中。此设置用于代码文件。

内容-该文件未编译,但包含在“内容”输出组中。例如,此设置是.htm或其他类型的Web文件的默认值。

嵌入式资源-该文件作为DLL或可执行文件嵌入在主项目构建输出中。它通常用于资源文件。


1
请在这里发表评论,如果有误导或不清楚的地方,只是投反对票并不能帮助我更好地改善它。提前致谢。
克里希纳kanth

1
我经常收到错误消息:包含“ Properties \ PublishProfiles \ FolderProfile.pubxml”的“ None”元素名称应为“ Content”。在我关于Bamboo的Asp.Net项目中,有时重新运行该构建就可以修复它,所以不知道到底是什么问题
Bochen Lin

@BochenLin,您好,您在此处提到的详细信息很少,您可以在此处尝试提供更多详细信息,还是可以发布带有完整问题详细信息和屏幕截图的新问题[然后在此处共享问题链接]。
克里希纳(Krishna kanth)

0

内容文件不包含在构建中,但包含在发布中。

除非您以这种方式配置文件,否则没有文件不会包含在构建或发布中。例如,“始终复制”或“较新”的“复制到输出目录”设置将导致它们同时包含在构建和发布中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.