C# 多项目打包时如何将项目引用转为包依赖
项目背景
最近开发一组类库,大约会有五六个项目。一个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,它也说行,but...请有经验的园友不吝赐教。
二、按条件引用
项目结构:
<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.
验证可行。
C# 多项目打包时如何将项目引用转为包依赖的更多相关文章
- maven 项目打包时无法解析读取properties文件
在做项目时遇见一个问题,无法解析properties文件的 内容 异常为 Could not resolve placeholder ......... 在此之前均有做相关的 配置 但是从未出现过如上 ...
- core项目打包时发现有的项目的xml文件不会被打包进去,怎么办?
我打包后发现打包后的文件夹内,不存在xml文件,所以swagger加载失败:然后经过测试发现Core项目打包的时候是默认不包含Xml文件的,VS里面也没有办法设置. 解决方法:手动修改项目文件,找到你 ...
- 使用cmd命令创建maven(web)项目+项目转换成IDEA项目+项目打包+Jetty运行Web项目
3条件:配置好环境 配置环境教程:https://www.cnblogs.com/weibanggang/p/9623705.html 第一步:查看版本信息,在cmd输入mvn –version,如果 ...
- 将Java项目打包成可以独立运行的Jar包
因为一直也没怎么用过Java的原因,所以以前本科上课的时候,在控制台下运行Java程序都是仅仅运行单个的没有第三方库依赖的情况下运行的 那种情况特别简单,只要输入Javac 文件名.java等到编译完 ...
- Maven项目打包时指定配置策略
以数据库连接池的配置文件(db.properties)为例,一般的项目会有开发用数据库,测试用数据库,正式环境数据库三种配置. 以前的做法是拷贝成三份,注释掉其他了两份 # 开发用 jdbc.url ...
- maven项目打包时生成dependency-reduced-pom.xml
今天给maven项目打jar包,发现在pom.xml文件的同路径下,突然生出了一个dependency-reduced-pom.xml,也不知道这个文件是干什么的,看着别扭就想着删除了它. 后来知道是 ...
- 本地jar在打包时打入到项目中去
<dependency> <groupId>com.hxyc</groupId> <artifactId>hxyc-common</artifac ...
- 怎么将java项目打包成双击就可以运行的jar包---fatjar
fatjar下载地址:http://pan.baidu.com/s/1cQ01o 下载fatJar插件,解压缩后是一个.../plugins/(net...)把plugins下面的(net..)文件夹 ...
- 如何用ABP框架快速完成项目(13) - 用ABP遇到难题项目受阻时如何避免项目延迟
只有一个人在开发ABP, 遇到难题时可以: 最根本的, 简化问题, 不要盖楼式结构 前端优先用VSCode看文档, 后端看官网文档. 看ABP源码/issues 到QQ群和微信群里寻求外援. 我建 ...
- 解决项目打包过程检出项目出现 svn:e15500错误
svn:E15500 is already a working copy for a different url 原因:文件夹含有svn信息的隐藏文件未删除 解决办法:把该文件夹删除掉,然后重新建立同 ...
随机推荐
- Peewee:Python 简洁强大的 ORM 框架
在 Python 的开发世界中,数据库操作是至关重要的一环. 今天介绍的 Peewee 作为一款简洁且功能强大的 ORM(对象关系映射)框架,为开发者提供了高效便捷的数据库交互方式. 1. Peewe ...
- VulNyx-Secrets
扫端口 扫描80端口发现有个secrets目录 还有个注释 继续扫发现http://192.168.200.11/secrets/login_form.php 有这个登录框 估计就是要爆破 usern ...
- Lua字节数组与float互转
纪念那些在双流工厂奋斗的日夜,防爆表屏项目 是一次很成功的实践,包括设计的页面堆栈和跳转机制 历史回退机制 页面密码保护机制 串口分包机制 ,运用综合所学来搭建的屏上独立内循环系统 ,自恋点说的话各 ...
- Q:Oracle表空间使用权限错误:ORA-01950
使用A用户账号(默认表空间tablespace_A),A用户表中插入数据报错ORA-01950 报错处理方法: 方法1:授予用户A unlimited tablespace权限 grant unlim ...
- Netty高级使用与源码详解
粘包与半包 粘包现象 粘包的问题出现是因为不知道一个用户消息的边界在哪,如果知道了边界在哪,接收方就可以通过边界来划分出有效的用户消息. 服务端代码 public class HelloWorldSe ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)
1.简介 通过前边两篇的学习,想必大家已经对iframe有了一定的认识和了解,是不是感觉和Python语言中的差不了多少,大同小异,最多就是不同开发语言的一些语法差异.今天这一篇主要是对iframe做 ...
- 如何配置支付宝密钥之如何配置普通 RSA2 密钥|保姆级教学(一)
进行支付宝开发的第一步就是:配置密钥. 但是有很多小伙伴都不知道怎么配置,这篇文章将手把手帮你从头开始捋清如何配置支付宝密钥- 这次首先放一下官方文档:[如何生成及配置 RSA2 密钥],大佬们也可以 ...
- DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
你好呀,我是歪歪. 五年前,2020 年,我写文章的时候曾经遇到过一个技术问题,百思不得其解,当时把那个问题归类为玄学问题. 后来也会偶尔想起这个问题,但是我早就不纠结于这个问题了,没再去研究过. 前 ...
- QT5笔记: 15. 其他显示组件的常用功能
其他显示组件的常用功能 代码 #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget ...
- springboot接入方式对接股票数据源API接口
为了创建一个Java项目来对接StockTV的API接口,我们可以使用HttpURLConnection或第三方库如OkHttp来发送HTTP请求,并使用Java-WebSocket库来处理WebSo ...