如何解决两个NuGet包中BeforeBuild目标仅执行一次的问题?
解决多个NuGet包预构建目标仅执行一次的问题
问题根源很明确:MSBuild中如果多个导入的目标文件定义了同名目标(比如这里的BeforeBuild),后导入的目标会直接覆盖先导入的,所以最终只会执行最后一个定义的BeforeBuild。
要让两个预构建步骤都生效,有两种可靠的解决方式:
方法1:通过依赖链扩展BeforeBuild
不要直接在NuGet包的目标文件中重新定义BeforeBuild,而是定义唯一命名的自定义目标,再把它追加到BeforeBuild的依赖列表里。
示例(第一个NuGet包的目标文件):
<!-- 定义自己的预构建目标,名称要唯一,比如带上包标识 --> <Target Name="PreBuild_PackageA"> <Exec Command='你的预构建命令' /> </Target> <!-- 把自定义目标追加到BeforeBuild的依赖中 --> <PropertyGroup> <BeforeBuildDependsOn>$(BeforeBuildDependsOn);PreBuild_PackageA</BeforeBuildDependsOn> </PropertyGroup>
第二个NuGet包依葫芦画瓢,只需要把目标名改成PreBuild_PackageB即可:
<Target Name="PreBuild_PackageB"> <Exec Command='你的另一条预构建命令' /> </Target> <PropertyGroup> <BeforeBuildDependsOn>$(BeforeBuildDependsOn);PreBuild_PackageB</BeforeBuildDependsOn> </PropertyGroup>
这样MSBuild执行BeforeBuild时,会自动依次执行所有追加到BeforeBuildDependsOn里的自定义目标,不会出现覆盖问题。
方法2:使用BeforeTargets属性绑定到BeforeBuild
直接给自定义目标添加BeforeTargets="BeforeBuild"属性,让它在BeforeBuild执行前自动触发,无需修改BeforeBuild本身。
示例(第一个NuGet包):
<Target Name="PreBuild_PackageA" BeforeTargets="BeforeBuild"> <Exec Command='你的预构建命令' /> </Target>
第二个NuGet包同样定义唯一命名的目标:
<Target Name="PreBuild_PackageB" BeforeTargets="BeforeBuild"> <Exec Command='你的另一条预构建命令' /> </Target>
这种方式下,所有标记了BeforeTargets="BeforeBuild"的目标都会在BeforeBuild之前按导入顺序执行,每个包的预构建步骤都能生效。
关键注意点
不管用哪种方法,自定义目标的名称必须唯一,建议带上包的专属标识(比如包名缩写、版本前缀),避免不同NuGet包的目标重名导致覆盖。
内容的提问来源于stack exchange,提问作者spartaco
相关产品推荐
相关产品推荐

