MSBuild 似乎每次都执行目标“BeforeBuild”,也好像库项目本身不需要构建。
如果库项目本身不需要构建,那么 msbuild 每次都执行目标是什么意思?据我所知,BeforeBuild 是构建过程中必不可少的目标之一,因此如果您构建一个项目,它将始终调用此目标。如果库项目不需要构建,您调用 msbuild 构建它的原因是什么?更多细节可能会更好:)
我想将构建过程配置为仅运行 PowerShell
如果库需要(重新)构建,则编写脚本。
有没有办法做到这一点?
我尝试使用目标“BeforeBuild”和“BeforeCompile”。但似乎
每次都执行。
BeforeBuild 和 BeforeCompile 是 msbuild 系统中的预定义目标。您可以覆盖它们以自定义构建步骤,但您无法避免在构建过程中运行它们。因此,每次构建开始时它们都会执行,这是设计的预期行为。
根据您的描述,您可以覆盖这些目标并在其中运行 power shell 脚本。这就是为什么在你的机器上它总是会调用 ps 脚本。
如果您通过 msbuild.exe 而不是 VS IDE 构建项目,这里有一个解决方法:
假设您在项目文件中覆盖了BeforeTarget。您可以添加condition 来确定是运行自定义 BeforeTarget(调用ps 脚本)还是原始 BeforeTarget。
定义一个名为RunPS的属性,并在你这样使用的BeforeTarget中添加一个条件:
<PropertyGroup>
<RunPS>false</RunPS>
</PropertyGroup>
<Target Name="BeforeBuild" Condition="$(RunPS)=='true'">
<!--Run the ps script here-->
</Target>
然后你可以通过设置RunPS的值来控制是使用默认的BeforeTarget还是自定义的。
msbuild xx.csproj /p:RunPS=true在构建过程中运行ps脚本,msbuild xx.csproj运行原始BeforeTarget
如果您在 VS IDE 中构建项目,您可以创建从 Debug 或 Release 复制的新配置(CustomDebug),并将Condition="$(Configuration)=='CustomDebug'" 设置为目标。
更新:
适用于 VS 和命令行的解决方法:
请参阅this document,在 VS 中,我们可以通过从调试和发布配置中复制设置来轻松创建新配置。
1.我认为,对于您的库项目,您有正常的Debug和Release配置,您可以按照文档中的提示创建相应的自定义配置。从 Debug 复制设置并创建一个名为 PSDebug 的新配置,从 Release 复制该设置并创建一个名为 PSRelease 的新配置。
2.然后编辑xx.csproj,添加如下格式的条件:
<Target Name="BeforeBuild" Condition="'$(Configuration)'=='PSDebug' OR '$(Configuration)'=='PSRelease'">
<!--Run the ps script here-->
<Message Text="showsth" Importance="high" />
</Target>
然后在 VS IDE 中,如果您使用普通配置 Debug or Release 构建,它将使用默认的 BeforeBuild 目标。只有当你使用自定义PSDebug or PSRelease构建时,它才会调用你自定义的BeforeBuild目标。在VS中,你可以通过这个框轻松地在这些配置之间切换:
对于命令行,它也可以工作。如果您使用msbuild xx.csproj /p:Configuration=Debug 之类的命令,它会使用预定义的BeforeBuild 目标来执行此操作,如果您使用msbuild xx.csproj /p:Configuration=PSDebug 之类的命令,它将调用您的自定义目标并运行PS 脚本。