【问题标题】:Post Build exited with code 1Post Build 以代码 1 退出
【发布时间】:2008-11-21 20:41:53
【问题描述】:

我有一个带有后期构建事件的项目:

copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe  $(TargetDir)

每次在我的机器上都能正常工作。我有一个新开发人员,他总是收到“以代码 1 退出”错误。我让她在 DOS 提示符下运行相同的命令,它运行良好。这可能是什么原因造成的?有没有办法解决真正的错误?

我们都使用 Visual Studio 2008。

【问题讨论】:

  • 在我的情况下,蒂姆斯科特在本页末尾附近提供的答案(所以我在开始时忽略了)解决了我的问题。

标签: visual-studio-2008 post-build


【解决方案1】:

她在路径中的一个文件夹名称中有一个空格,并且没有引号。

【讨论】:

  • 在路径名上加上引号是一种很好的做法。不在包含空间的路径中工作更好:-)
  • copy /y "$(TargetDir)Dotfuscated\" "$(TargetDir)" 这个命令对我不起作用,如果我在最后写出口 0 然后工作正常。你能告诉我为什么吗?
【解决方案2】:

带有“Pings”的那个帮助了我...但可能解释得更好...

对我来说,解决办法是改变:

copy $(TargetDir)$(TargetName).* $(SolutionDir)bin

到这里:

copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"

希望它对你有用。 :-)

【讨论】:

    【解决方案3】:

    我已经为未来的访问者添加了这个,因为这是一个非常活跃的问题。

    ROBOCOPY 以小于 8 的“成功代码”退出。请参阅:http://support.microsoft.com/kb/954404

    这意味着:

    robocopy exit code 0 = no files copied
    robocopy exit code 1 = files copied
    When the result is 1, this becomes an error exit code in visual studio.
    

    所以我通过将其添加到批处理文件的底部轻松解决了这个问题

    exit 0
    

    建议以这种方式处理 ROBOCOPY 错误

    rem each robocopy statement and then underneath have the error check.
    if %ERRORLEVEL% GEQ 8 goto failed
    
    rem end of batch file
    GOTO success
    
    :failed
    rem do not pause as it will pause msbuild.
    exit 1
    
    :success
    exit 0    
    

    当没有文件被复制时会出现混乱 = VS 中没有错误。然后,当发生更改时,文件确实被复制,VS 错误,但开发人员想要的一切都完成了。

    附加提示:不要在脚本中使用暂停,因为这将成为 VS 构建中的无限暂停。在开发脚本时,使用类似timeout 10 的东西。您会注意到这一点并将其注释掉,而不是挂起构建。

    【讨论】:

    • 正是我想要的。谢谢!!
    • 撞了一个 8 年前的答案说,如果你想要一个单行文件,而不是一个 bat 文件,你可以在构建后的末尾添加一个“& exit 0”事件字符串。
    • 在底部添加“exit 0”,效果很好。恕我直言,这似乎是一个很好的解决方案,因为如果实际发生任何事情,我们可以看到实际问题的日志。
    • 在项目中使用 Copy msbuild 任务也是一种选择。唯一的问题是我们必须手动编辑项目文件,而项目设计者不支持添加/编辑这个。
    【解决方案4】:

    我选择代码 1 的原因是目标文件夹是只读的。希望这对某人有帮助! 我有一个构建后事件来从一个目录复制到另一个目录,并且目标是只读的。所以我只是去取消选中目录及其所有子目录的只读属性!只要确保它是一个安全的目录!

    【讨论】:

    【解决方案5】:

    获取process monitor from SysInternals 设置它来观察 Lunaverse.DbVerse(在 Path 字段上)查看操作结果。 从那里应该很明显出了什么问题

    【讨论】:

      【解决方案6】:

      我必须以管理员身份运行 VS 才能将构建后的副本复制到受操作系统保护的“..\Common7\IDE\PrivateAssemblies”中

      【讨论】:

        【解决方案7】:

        我遇到了类似的问题,但特别是在 Jenkins 构建环境中。为了解决这个问题,我从在构建后事件中使用复制命令切换到使用复制目标。

        我改变了这个:

           <PropertyGroup>
              <PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
           </PropertyGroup>
        

        到这里:

          <Target Name="AfterBuild">
            <Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
          </Target>
        

        现在可以正常使用了。

        我得到的具体错误是:

        (PostBuildEvent target) -> 
          C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>
        

        【讨论】:

        • 您是如何做出这种改变的?你是手动编辑的吗?你如何执行目标?这看起来像是您必须在 msbuild 命令行中指定的内容。我在 jenkins 环境中遇到了完全相同的问题,这很奇怪,因为所有 msbuild 创建的文件夹始终是只读的。为什么它在我的机器上复制得很好,但在服务器上却不行。
        • 我刚刚使用 Notepad++ 编辑了 csproj 文件。 “AfterBuild”钩子是一个标准的钩子,所以如果它存在,它会在构建过程之后自动调用。
        • 谢谢。我不确定您是否有一个带有目标的自定义 msbuild 文件,或者它是否只是 Visual Studio 创建的文件。仅供参考:就我而言,我发现问题与构建顺序有关。我忘记在发布、解决方案配置中设置构建依赖项,因此项目以不同的顺序在服务器上构建,因此在执行副本时输入文件尚不可用。确保 .dll 是在需要它为我修复它的其他项目之前生成的。这是导致它的解决方案配置的一个非常微妙的问题。
        • 起初构建顺序是针对每个配置的并不明显。我认为这更像是一种解决方案设置,但显然您必须更新所有配置中的构建顺序。
        【解决方案8】:

        对于那些在构建事件预构建事件命令行或/和发布)中使用“复制”命令的人-build event command line) 来自 Project -> Properties:您的“copy”命令参数应如下所示:copy "source of files" "destination for files"。记得使用引号(以避免地址字符串中的空格问题)。

        【讨论】:

          【解决方案9】:

          我能够通过以管理员身份运行 Visual Studio 来修复我的代码 1。显然它没有权限在没有管理员的情况下执行 shell 命令。

          【讨论】:

            【解决方案10】:

            好的,这是一个有很多解决方案的问题,所以我只是发布我的问题来给人们更多的提示。 我的情况是仔细检查路径中的文件夹并确保它们都存在于您的机器中。例如:“$(SolutionDir)\partBin\Bin\$(ProjectName).pdb”,但“Bin”不在partBin文件夹中。

            【讨论】:

            • 顺便说一句,$(SolutionDir) 之后的 \ 是多余的。
            【解决方案11】:

            作为一种良好做法,我建议您将构建后事件替换为 MS Build File Copy task

            【讨论】:

            • 一个比另一个有什么好处?
            【解决方案12】:

            对我来说,我必须确保我正在处理文件的程序当时没有运行。语法没有任何错误。希望这可以帮助某人。

            【讨论】:

              【解决方案13】:

              我刚刚收到同样的错误。我在目标路径中有一个 % 需要转义

              c:\projects\%NotAnEnvironmentVariable%
              

              需要

              c:\projects\%%NotAnEnvironmentVariable%%
              

              【讨论】:

                【解决方案14】:

                对于那些在项目 -> 属性中的构建事件(构建前事件命令行或/和构建后事件命令行)中使用“复制”命令的人:目标文件夹应该存在

                【讨论】:

                  【解决方案15】:

                  这么多解决方案...

                  就我而言,我必须使用非 unicode(西方、Windows)编码保存 bat 文件。默认情况下,当我将文件添加到 Visual Studio 时(可能我应该在 VS 之外完成),它添加了 UTF-8 编码。

                  【讨论】:

                    【解决方案16】:

                    我遇到了同样的问题,结果发现是因为我重命名了项目。我进入项目属性并将程序集名称和根命名空间更改为项目名称,之后效果很好!

                    【讨论】:

                      【解决方案17】:

                      又一个答案...

                      就我而言,我有一个针对 .Net Standard 1.3 和 .Net Framework 2.0 的 Visual Studio 2017 项目。这是在 .csproj 文件中指定的,如下所示:

                      <TargetFrameworks>netstandard1.3;net20</TargetFrameworks>
                      

                      我还有一个像这样的构建后事件命令行:

                      copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"
                      

                      换句话说,我试图将构建生成的 .Net Framework .dll 复制到另一个位置。

                      当我进行重建时出现此错误并失败:

                      MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.
                      

                      在经历了很多挫折之后,我终于确定发生的事情是 Rebuild 删除了所有输出文件,然后为 .Net Standard 1.3 进行了构建,然后尝试运行构建后事件命令行,但失败了,因为文件要复制的尚未构建。

                      因此解决方案是更改构建顺序,即首先为 .Net Framework 2.0 构建,然后为 .Net Standard 1.3 构建。

                      <TargetFrameworks>net20;netstandard1.3</TargetFrameworks>
                      

                      这现在可以工作了,只是生成后事件命令行运行两次的小故障,因此文件被复制了两次。

                      【讨论】:

                        【解决方案18】:

                        在我的情况下,我必须在调用 bat 文件之前cd(更改目录),因为在 bat 文件中是一个指定相对路径的复制操作。

                        :: Copy file
                        cd "$(ProjectDir)files\build_scripts\"
                        call "copy.bat"
                        

                        【讨论】:

                          【解决方案19】:

                          对我来说,原因是构建在构建输出文件夹 (x86) 上创建了一个平台文件夹,解决方法是将解决方案平台从“混合平台”更改为“任何 CPU” 在VS中

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2017-04-25
                            • 2013-08-31
                            • 1970-01-01
                            • 1970-01-01
                            • 2019-10-15
                            • 2017-03-01
                            相关资源
                            最近更新 更多