首页 > 解决方案 > 传递给 MsBuild 的 Arg 在 PostBuildEvent 上无法识别

问题描述

我有一个 csproj 文件,我想在我的 jenkins-server 上编译它,其中包含一个 postbuild-event:

<PostBuildEvent>
    IF NOT DEFINED AAACOPYNEWONLY GOTO :EOF

    IF "%25AAACOPYNEWONLY%25" == "yes" (
        SET NEWOPT=/D
    ) ELSE (
        SET NEWOPT=
        RMDIR /S /Q "$(Outdir)\..\schema"
    )

    XCOPY /E /Y /I /Q %25NEWOPT%25 $(ProjectDir)..\schema "$(Outdir)\..\Schema"
</PostBuildEvent>

当我AAACOPYNEWONLY在 Windows 中定义为系统环境变量时,一切正常,并且schema-folder 被复制到ProjectDir所指的任何内容。

但是,当我直接在对 msbuild 的调用中提供变量时,不会创建文件夹:

msbuild MyProject.csproj -t:ReBuild -p:AAACOPYNEWONLY=NO

我还扫描了我的日志文件,但没有任何迹象表明 xcopy 甚至已运行,这让我假设条件IF NOT DEFINED AAACOPYNEWONLY不匹配。

当作为 arg 提供给 msbuild 时,为什么变量没有适当地传递到事件中?

编辑:我简化了我的后期构建,简单地打印变量的内容:

<PostBuildEvent>
    echo AAACOPYNEWONLY = "%25AAACOPYNEWONLY%25"
</PostBuildEvent>

这只是打印AAACOPYNEWONLY = ""

标签: jenkinsmsbuildpost-build-event

解决方案


您应该csproj以与其他 MSBuild 属性相同的方式在文件中定义您的属性,例如ConfigurationPlatform

<PropertyGroup>
...
   <AAACOPYNEWONLY Condition=" '$(AAACOPYNEWONLY)' == '' ">NO</AAACOPYNEWONLY>
...
</PropertyGroup>

比您可以将其作为参数传递给 msbuild 命令行,例如-p:AAACOPYNEWONLY=NO-p:AAACOPYNEWONLY=YES


推荐阅读