.net core 了解.NET核心csproj操作
我正在尝试将文件夹的内容复制到生成输出。理想情况下,位于相对于输出/发布文件夹的相同路径下。我有:.net core 了解.NET核心csproj操作,.net-core,msbuild,.net Core,Msbuild,我正在尝试将文件夹的内容复制到生成输出。理想情况下,位于相对于输出/发布文件夹的相同路径下。我有: <!-- front-end files to serve --> <ItemGroup> <Folder Include="Frontend\Content"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Folder> </ItemG
<!-- front-end files to serve -->
<ItemGroup>
<Folder Include="Frontend\Content">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Folder>
</ItemGroup>
所以我的问题是-这是什么疯狂?从语义上讲,一个名为None
的元素带有Remove
属性——这到底是什么意思
我模糊的直觉是,该元素相当于一个“集合”,其内容将根据该元素/集合的名称进行操作,包括、排除、移除(?)以某种方式交互以定义和细化该集合的内容
但是,什么是“文件夹”?什么是“内容”?当事情加倍时会发生什么:为什么需要“无/删除”组合?如果它是在所有-这是产生的VS
在文档方面,我发现:
,它讨论编译、EmbeddedResource和无默认全局变量(包括、排除和删除全局变量)。我知道什么是地球仪,我知道这些行动意味着什么,但这些地球仪是什么类型的?他们如何互动
它还指向位于的MSBuild文档,但这似乎没有用:它没有记录所显示的None
、EmbeddedResource
、或Compile
元素,也没有讨论我在其他示例中找到的内容
和文件夹
元素(由VS生成)
事实上,我还没有发现任何关于这一切意味着什么的东西
我在哪里可以找到这方面的文档
在VS中使用,仅显示解决方案资源管理器中的一个节点,例如,右键单击“添加>新建…”wwwroot
是ASP.NET核心应用程序的经典示例,但如果您使用VS的“添加>新建文件夹”功能或删除现有文件夹中的所有文件,它将添加一个节点以将其保留在解决方案资源管理器中
生成期间不使用
项。复制项是基于在已知项类型(无、内容等)上指定的元数据而不是基于文件系统层次结构中的文件夹项来确定的
如果要为整个层次结构指定元数据,可以执行以下操作:
<Content Include="my/content/**/*" CopyToPublishDirectory="True" … />
因此,如果要将文件更改为嵌入式资源或内容项,应将该文件从@(无)
集合中删除
如果您不需要更改项目类型,也可以使用更新
:
<None Update="some/content/**/*" CopyToOutputDirectory="True" />
下的那些东西做什么呢?<MyCoolFiles Include="cool/files/**/*;other/cool/files/**/*" />
<None Remove="@(MyCoolFiles)" />
<Content Include="@(MyCoolFiles)" CopyToPublishDirectory="True" />
<Target Name="PrintCoolFiles" BeforeTargets="BeforeBuild">
<Message Importance="high" Text="These are my cool files: @(MyCoolFiles)" />
</Target>
关键的一点是,构建逻辑的某些部分会查找他们知道并使用的项
计算编译器输入的部分将查看Compile
和EmbeddedResource
项,确定要复制到输出目录的文件的部分将查找各种项(None
,Content
,EmbeddedResource
和其他一些IIRC)使用特定的元数据集
新的项目类型可以定义自己的项目类型,通过扩展点在VS的解决方案资源管理器中列出
但是VS将仅在解决方案资源管理器中显示以这种方式配置的项目类型的项目。对于这些项目类型,不在多个项目中列出文件是有意义的。没有疯狂。VisualStudio总是这样工作的。生成操作为内容的文件将被发布。其他文件则不是。如果您试图发布一个“经典”ASP.NET web应用程序,您将得到相同的行为
CopyToOutputDirectory
的意思是,应该将某些内容复制到配置的输出目录(bin/debug或bin/release)。它不影响文件的类型、生成操作或是否应该打包或发布。您不需要在内容元素中添加CopyToOutputDirectory
即可发布。这些内容自2002年以来就在IDE文档、操作指南、教程和课程中广泛记录。部署像js
和css
文件这样的内容对任何web应用程序都至关重要。例如@PanagiotisKanavos,你能回答我提出的任何问题吗?为什么我的复制任务不起作用?各种集合和动作是如何相互作用的?如果需要无/删除?文件在哪里?这里的链接并没有涵盖其中的绝大部分?(还有——“没有疯狂。Visual Studio一直都是这样工作的”-这些不是相互排斥的)谢谢,这确实很有帮助。我可以问一下吗?文件夹
与无
有何不同?为什么总是对文件夹
不做任何事情?似乎所有或大多数其他目标都一致支持这一属性。它们是否都复制了这个功能的实现?只是没有任何构建逻辑来处理它们。对于None/Content/EmbeddedResource/BaseApplicationManifest,有一个确定在何处复制它们、创建一些中间项,然后使用这些项来创建最终的集合目标,例如\u CopyOutofDateSourceItemsOutputDirectory
,然后使用这些集合来完成工作。这些目标是的依赖项。除此之外,无论您希望复制什么,您都需要为构建其他逻辑以集成到此管道中。对我来说,这是至关重要的,原因有两个:(1)当…
节点不起作用时,
节点上的属性起作用,以及(2)它帮助我认识到,一些可能在解决方案级别定义的变量不一定存在,所以尽量不要使用它们!
<None Include="**/*" />
<None Update="some/content/**/*" CopyToOutputDirectory="True" />
<MyCoolFiles Include="cool/files/**/*;other/cool/files/**/*" />
<None Remove="@(MyCoolFiles)" />
<Content Include="@(MyCoolFiles)" CopyToPublishDirectory="True" />
<Target Name="PrintCoolFiles" BeforeTargets="BeforeBuild">
<Message Importance="high" Text="These are my cool files: @(MyCoolFiles)" />
</Target>