【问题标题】:Add props file properties/variables to csproj hint path将 props 文件属性/变量添加到 csproj 提示路径
【发布时间】:2023-08-01 16:22:01
【问题描述】:

我已添加 .props 文件并将其包含在 .nuspec 文件中。 在我的 .props 文件中,我在 PropertyGroup 中添加了新的属性/元素。 安装我的 nuget 包后,.props 文件在 .csproj 文件中成功导入。但是如何在 HintPath 中包含/添加道具文件属性/变量(不是手动)。

【问题讨论】:

    标签: c# msbuild nuget nuget-package csproj


    【解决方案1】:

    为您的 nugets 使用 HintPath 和 .nuspec 是遗留方法的一个指标,请考虑 PackageReferenceSDK style csproj 相反,根本没有提示路径,它们都是自动的。

    提示路径的遗产

    提示路径通常用作 nuget 安装程序集的引用项的项元数据。旧项目格式是在 nuget 是外部工具时开发的(现在它是 .Net SDK 的一部分)。当时的方法是让 packages.config(你不再需要它)和安装到项目中的 nugets 列表,并且在安装包时它必须出现在 .net 的其余部分工具作为一组常规的侧载程序集,这就是为什么 DLL 文件被恢复到“包”文件夹(这不再发生),并且参考项被添加到项目中,其 HintPath 具有相对此“包”文件夹的路径。这包括整个引用图,因此如果 PackageA 使用 PackageB,则两者都部署到“包”文件夹,并且都在每个包的所有库上生成引用项。通过这种方式,遗留工具用于将包管理带入现有生态系统。对于新的 PacakgeReference 方法,您只需指定*包,所有临时引用将在恢复和构建时自动处理。

    自定义目标

    既然你提到你的 nuspec 中有 props 文件,让我澄清一下现在如何在 SDK 样式 csproj 在你正在发布的包中实现它(没有 nuspec,所有 nuspec数据现在在 csproj 中):

      <ItemGroup>
        <None Include="your_custom.props_or_targets">
          <Pack>true</Pack>
          <PackagePath>build</PackagePath>
        </None>
      </ItemGroup>
    

    因此,目标路径在 PackagePath 项元数据中指定,它应该是 build 以表示这是可自动安装的目标。

    现在在安装这样的包时,在传统方法中,消费者项目会自动具有“导入”节点,以明确地将这个目标带到项目中。现在在新的 SDK 方法中,如果您使用 PackageReference 导入这样的包,您将找不到 Import 节点 - 它实际上是隐式假设的,所以如果有问题的包在构建文件夹中有目标和道具 - 所有这些都将自动导入构建时间(不在设计时间)。

    包参考

    <ItemGroup>
        <PackageReference Include="YourPackage" Version="3.6.0" />
    </ItemGroup>
    

    因此,如果您使用这样的项目,这足以使用您在此包中使用自定义道具带来的属性。像往常一样随意使用它们,希望你不再需要 HintPath。

    【讨论】: