VS2017中如何通过MSBuild同步更新netstandard项目版本及依赖?
解决VS2017中NetStandard项目MSBuild同步版本与依赖的问题
这个问题其实不是bug,而是默认MSBuild行为的设计逻辑——PackageVersion参数仅控制当前项目生成的NuGet包版本,不会自动修改项目引用/依赖项里硬编码的版本号。下面是几个不需要正则替换的优雅解决方案:
1. 用Directory.Build.props统一管理所有版本
这是最推荐的方式,能一次性同步解决方案内所有项目的版本及依赖版本:
- 在解决方案根目录新建一个
Directory.Build.props文件,内容如下:<Project> <!-- 定义统一版本变量,所有项目都会自动继承 --> <PropertyGroup> <Version>3.1.7</Version> <!-- 让NuGet包版本和项目版本保持一致 --> <PackageVersion>$(Version)</PackageVersion> <!-- 同步程序集版本和文件版本(解决"项目实际版本不更新"的问题) --> <AssemblyVersion>$(Version)</AssemblyVersion> <FileVersion>$(Version)</FileVersion> </PropertyGroup> </Project> - 修改所有项目的依赖引用:把beta项目中对alpha的依赖版本从硬编码的
2.0.0改成$(Version),比如beta的csproj里:<PackageReference Include="Alpha" Version="$(Version)" /> - 之后执行构建命令时,只需要指定统一版本即可:
这样所有项目的版本、NuGet包版本,以及依赖的版本都会同步更新到3.1.7。msbuild /p:Configuration=Release /p:Version=3.1.7
2. 针对项目引用的特殊处理
如果beta和alpha是项目引用(而非PackageReference),需要确保构建时传递正确的版本:
- 在beta项目的csproj中,修改项目引用节点,添加版本传递相关属性:
<ProjectReference Include="..\Alpha\Alpha.csproj"> <PrivateAssets>All</PrivateAssets> <GeneratePathProperty>true</GeneratePathProperty> <!-- 确保依赖项目的包版本使用统一变量 --> <SetTargetFramework>TargetFramework=netstandard2.0</SetTargetFramework> </ProjectReference> - 同时确保在构建时启用
Restore步骤,让MSBuild正确解析项目引用的版本:msbuild /t:Restore,Build /p:Configuration=Release /p:Version=3.1.7
3. 直接通过MSBuild参数传递所有版本属性
如果你不想用Directory.Build.props,也可以在命令行中一次性指定所有相关版本参数,确保项目版本和依赖版本同步:
msbuild /p:Configuration=Release /p:Version=3.1.7 /p:PackageVersion=3.1.7 /p:AssemblyVersion=3.1.7 /p:FileVersion=3.1.7
但这种方式需要确保所有项目的依赖版本都使用$(Version)变量,否则还是会出现依赖版本不更新的问题。
内容的提问来源于stack exchange,提问作者tofutim
相关产品推荐
相关产品推荐

