繁体   English   中英

随 nuget package 一起安装的源生成器可配置设置文件

[英]Source generator configurable settings file installed with nuget package

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

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

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

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

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

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

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

我主要从钱先生那里得到这个答案 我首先尝试几乎完全按照该帖子中的方式实现:

我将 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>

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

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

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

所以我的工作设置使用了对上面提到的项目文件的更改,以下 .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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM