gpt4 book ai didi

.net-core - 了解 .NET Core csproj 操作

转载 作者:行者123 更新时间:2023-12-04 11:11:06 27 4
gpt4 key购买 nike

我正在尝试将文件夹的内容复制到构建输出。理想情况下,在相对于输出/发布文件夹的相同路径下。我有:

<!-- front-end files to serve -->
<ItemGroup>
<Folder Include="Frontend\Content">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Folder>
</ItemGroup>

但是,当我使用 dotnet publish 时,没有文件被复制。

这适用于我想要的配置文件 - 这是由 VS 生成的:
<ItemGroup>
<None Remove="my-config.json" />
</ItemGroup>
<ItemGroup>
<Content Include="my-config.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

所以我的问题是 - 这是什么疯狂?在语义上,一个名为 None 的元素与 Remove属性 - 这甚至意味着什么?

我模糊的直觉是该元素相当于一个“集合”,其内容将根据该元素/集合的名称进行操作,并且包含、排除、删除以某种方式(?)交互以定义和改进内容那套。

但是 - 什么是“文件夹”?什么是“内容”?当事情加倍时会发生什么:为什么需要“无/删除”组合?如果是的话 - 那是由 VS 生成的!

在文档方面,我发现:

https://docs.microsoft.com/en-us/dotnet/core/tools/csproj#how-to-see-the-whole-project-as-msbuild-sees-it ,其中讨论了 Compile、EmbeddedResource 和 None 默认 globs(Include、Exclude 和 Remove globs)。我知道 glob 是什么,我知道这些 Action 是什么意思,但是这些类型的 glob 是什么?他们如何互动?

它还指向 https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-project-file-schema-reference?view=vs-2017 处的 MSBuild 文档。 ,但这似乎没用:它没有记录 None , EmbeddedResource , 或 Compile显示的元素,也没有谈到 ContentFolder我在其他示例中找到的元素(由 VS 生成)。

事实上,我还没有发现任何关于这一切意味着什么的东西。

我在哪里可以找到这方面的文档?

最佳答案

  • 文件夹项目
  • <Folder>在 VS 中使用仅在解决方案资源管理器中显示一个节点,例如让你点右键单击“添加>新建...”。 wwwroot是 ASP.NET Core 应用程序的经典示例,但如果您使用 VS 的“添加 > 新建文件夹”功能或删除现有文件夹中的所有文件,它将添加一个节点以将其保留在解决方案资源管理器中。
    <Folder>在构建期间不使用项目。复制项目是根据在已知项目类型(无、内容等)上指定的元数据确定的,而不是基于文件系统层次结构中的文件夹项目。

    如果要为整个层次结构指定元数据,可以执行以下操作
    <Content Include="my/content/**/*" CopyToPublishDirectory="True" … />
  • 包含/删除组合

  • 在项目文件的静态内容内(不在 <Target> 内 - 其中适用一些不同的规则),MSBuild 允许对项目集合进行三种操作:
  • 包含:在指定项目类型的项目的“集合”中添加项目
  • 更新:更改指定项目类型的项目的元数据
  • 删除:从“集合”中删除项目

  • 这意味着如果你这样做
    <None Include="foo.txt" />
    <Content Include="foo.txt" />

    然后是 @(None)@(Content)集合将包含 foo.txt .这对于构建系统来说并不是真正的问题(除非您指定要将它们都复制到输出 - 这会导致输出路径冲突的错误),但是对于向您显示项目中的文件及其属性的工具来说可能会造成棘手的情况。

    foo.txt被列为 None , ContentEmbeddedResource ,那么 IDE(VS、Rider、VS/Mac 等)工具必须艰难地决定向您展示该文件的内容。

    为了缓解这个问题,最好确保文件仅作为这些“构建操作”项类型之一列出,这样 IDE 就不会混淆(也不会混淆用户)。

    那么为什么必须从 None 中删除文件? ?

    新的“SDK 风格”项目添加了很多默认值。它们基本上包含类似(简化!!):
    <None Include="**/*" />

    因此,如果您想将文件更改为嵌入资源或内容项,您应该从 @(None) 中删除该文件。收藏。

    如果不需要更改项目类型,也可以使用 Update :
    <None Update="some/content/**/*" CopyToOutputDirectory="True" />
  • 那么<ItemGroup>下的那些东西怎么办?做?

  • 这些定义本身没有任何作用。他们只是填充/更改“项目”的集合。
    您甚至可以创建自己的并在以后使用它们:
    <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>

    关键是构建逻辑的某些部分会查找他们知道的项目并使用它们。

    计算编译器输入的部分会看 CompileEmbeddedResource项目,确定将哪些文件复制到输出目录的部分将查找具有特定元数据集的各种项目( NoneContentEmbeddedResource 和其他一些 IIRC)。

    新的项目类型可以定义自己的项目类型,以通过扩展点在 VS 的解决方案资源管理器中列出。

    但是 VS 只会在解决方案资源管理器中显示以这种方式配置的项目类型的项目。对于这些项目类型,最好不要在其中列出多个文件。

    关于.net-core - 了解 .NET Core csproj 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195709/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com