网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 后端开发 > .Net >

.NET SDK样式项目打包时如何将项目引用转为包依赖

时间:2025-04-10 23:30

人气:

作者:admin

标签:

导读:项目背景 最近开发一组类库,大约会有五六个项目。一个Core,加上若干面向不同产品的实现库,A/B/C/D...它们都依赖Core. 首先,我想统一版本号,这个容易,通过Directory.Build.props设置。...

项目背景

最近开发一组类库,大约会有五六个项目。一个Core,加上若干面向不同产品的实现库,A/B/C/D...它们都依赖Core.

首先,我想统一版本号,这个容易,通过Directory.Build.props设置。

其次,每个库要单独发包。

问题是在开发阶段,子项目都是通过项目引用Core的,便于调试,怎么实现在打包时自动加上对Core包的依赖?

经过试验,可以总结三种方法:

一、生成时将 ProjectReference 转为 NuGet 依赖项 (Not Work)

这个是DeepSeek推荐的方案,但很遗憾,我没试验成功。
它的项目结构是这样的:

<ItemGroup>
  <ProjectReference Include="..\Core\MyProject.Core.csproj" >
    <PrivateAssets>all</PrivateAssets>
    <Publish>true</Publish>
    <Version>$(PackageVersion)</Version>
    <PackageId>MyProject.Core</PackageId>
  </ProjectReference>
</ItemGroup>


<Target Name="ForcePackageReferenceConversion" BeforeTargets="GenerateNuspec">
  <ItemGroup>
    <_PackageReferencesToAdd Include="@(ProjectReference->WithMetadataValue('Publish', 'true'))">
      <PackageId>%(PackageId)</PackageId>
      <Version>%(Version)</Version>
    </_PackageReferencesToAdd>
    <PackageReference Include="@(_PackageReferencesToAdd->'%(PackageId)')" Version="%(Version)" />
  </ItemGroup>
</Target>

它的核心思路是生成.nuspec前将项目引用强制转换在包引用。

至于为什么没成功,Github Copilot的解释如下:

This is a common scenario, but unfortunately, MSBuild and NuGet do not natively support automatically converting a to a at pack time. The custom target approach (like ForcePackageReferenceConversion) does not work because NuGet determines dependencies before your target runs.

二、按条件引用

项目结构:

<ItemGroup>
  <!-- 开发时使用 ProjectReference -->
  <ProjectReference Include="..\Core\MyProject.Core.csproj"
                    Condition="'$(IsPackaging)' != 'true'" />

  <!-- 打包时使用 PackageReference -->
  <PackageReference Include="MyProject.Core"
                    Version="$(PackageVersion)"
                    Condition="'$(IsPackaging)' == 'true'" />
</ItemGroup>

然后使用命令生成:

dotnet pack -p:IsPackaging=true

此法可行,推荐使用。

三、指定.nuspec文件

最后,我又想到了用传统的.nuspec文件。(我很喜欢以前的包管理方式,packages.config/nuspec,不理解为什么MS非要把所有的东西都往project文件里塞。)

项目结构:

  <!-- 指定自定义 nuspec 文件路径 -->
    <NuspecFile>My.nuspec</NuspecFile>
    <!-- 传递 MSBuild 属性到 nuspec 中的变量 -->
    <NuspecProperties>$(NuspecProperties);
      id=$(PackageId);
      version=$(Version);
      company=$(Company);
      authors=$(Authors);
      product=$(Product);
      copyright=$(Copyright);
      license=$(PackageLicenseExpression);
      projectUrl=$(PackageProjectUrl);
      repositoryUrl=$(RepositoryUrl);
      repositoryType=$(RepositoryType);
      icon=$(PackageIcon);
      config=$(Configuration)
    </NuspecProperties>

它将Directory.Build.props中定义的属性一一赋给nuspec.
验证可行,此法适合制作复杂的包。

作者:CnSharp工作室 出处:http://www.cnblogs.com/cnsharp/ 本文版权归CnSharp.com所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信