【问题标题】:Source generator configurable settings file installed with nuget package使用 nuget 包安装的源生成器可配置设置文件
【发布时间】:2022-08-17 04:08:42
【问题描述】:

我创建了一个源生成器,它从配置文件中读取一些信息,允许使用者更改更改生成器输出的设置。通过将以下内容添加到 .csproj 文件中,该文件将添加到使用项目中:

<ItemGroup>
      <AdditionalFiles Include=\"generator.config\" />
</ItemGroup>

我希望同事能够安装我的 nuget 包并将 generator.config 文件以及上述 ItemGroup 自动添加到他们的项目中。

我认为这会很简单,但我已经花了几天时间试图实现这一目标,但到目前为止没有运气,我已经准备好拔掉我的头发了。我试过了:

  • 在包的 content 和 contentFiles 目录中包含 generator.config。这确实将文件放入了消费项目,但它不可编辑,这使得它成为无用的配置文件。
  • 我的 nuget 包中 .props 和 .targets 文件的各种排列。我设法在构建后将 generator.config 复制到输出目录,但没有复制到项目目录
  • 我发现一些帖子谈论运行一个 powershell 脚本以在安装时复制文件,但这似乎是一种已弃用的解决方法

我想我可能会遇到一些额外的困难,因为我的消费项目以.NET 6 为目标,而源代码生成器必须以 netstandard2.0 为目标。通过查看 .csproj 文件,我只对 Nuget/MSBuild 有过熟悉,所以我怀疑我可能遗漏了一些相当明显的东西,但任何帮助/建议将不胜感激。

    标签: c# msbuild nuget sourcegenerators csharp-source-generator


    【解决方案1】:

    我设法让这个工作。对于可能遇到类似问题的任何人:

    我主要工作在this answer from Mr Qian。我首先尝试几乎完全按照该帖子中的方式实现:

    我将 generator.config 文件放在项目根目录中,将以下内容添加到生成器项目文件中:

    <ItemGroup>
        <None Include="generator.config" Pack="true" PackagePath="lib"></None>
        <None Include="build\myGenerator.props" Pack="true" PackagePath="build"></None>
    </ItemGroup>
    

    然后我在我的项目根目录下创建了一个“build”目录,并按照链接答案中的建议创建了 myGenerator.props:

    <Project>
        <ItemGroup>
            <AdditionalFiles Include="generator.config" />
        </ItemGroup>
        <Target Name="CopyGeneratorConfig" BeforeTargets="Build" Condition="!Exists('$(MSBuildProjectDirectory)\generator.config')">
            <ItemGroup>
                <MyEnvConfig Include="$(MSBuildThisFileDirectory)..\lib\generator.config"/>
            </ItemGroup>
            <Copy
               SourceFiles="@(MyEnvConfig)"
               DestinationFolder="$(MSBuildProjectDirectory)"
             />
        </Target>
    </Project>
    

    但这对我根本不起作用。似乎什么都没有发生。

    通过将&lt;Target&gt; 分离到它自己的 myGenerator.targets 文件中,我取得了一些进展。这样做之后,我可以在安装 nuget 包后立即在消费项目的 Imports 下看到我的&lt;AdditionalFiles&gt;。但是文件副本仍然不起作用。我的 Copy 目标似乎根本没有运行。

    经过一番绞尽脑汁、咬牙切齿、拔头发和疯狂的谷歌搜索后,我找到了解决方案:将复制目标上BeforeTargets 的值从“Build”更改为“BeforeBuild”。一旦我做了那个改变,它就完全按照我的意愿工作了。 (嗯,几乎完全一样......它仍然需要构建,我理想地希望在安装 nuget 包时发生副本。)

    所以我的工作设置使用了对上面提到的项目文件的更改,以下 .props 文件(注意 .props 和 .targets 之前的名称必须与您的项目名称匹配):

    <Project>
        <ItemGroup>
            <AdditionalFiles Include="generator.config" />
        </ItemGroup>
    </Project>
    

    以及以下 .targets 文件:

    <Project>
        <Target Name="CopyGeneratorConfig" BeforeTargets="BeforeBuild" Condition="!Exists('$(MSBuildProjectDirectory)\generator.config')">
            <ItemGroup>
                <MyEnvConfig Include="$(MSBuildThisFileDirectory)..\lib\generator.config"/>
            </ItemGroup>
            <Copy
               SourceFiles="@(MyEnvConfig)"
               DestinationFolder="$(MSBuildProjectDirectory)"
             />
        </Target>
    </Project>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多