发布生成已退出,代码为1


107

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

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

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

我们俩都使用Visual Studio 2008。


就我而言,蒂姆·斯科特(Tim Scott)在本页结尾处提供的答案(所以我在一开始就忽略了)可以解决我的问题。
洋剑

Answers:


115

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


12
在路径名上加上引号是一个好习惯。不能在包含空间的路径中工作会更好:-)
Asher

4
复制/ y“ $(TargetDir)Dotfuscated \”“ $(TargetDir)”此命令对我不起作用,如果我在末尾写出口0,则工作正常。你能告诉我为什么吗?
金·帕特尔

59

带有“ Pings”的人对我有帮助...但可能会解释得更好一点...

对我来说,解决方案是更改:

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

对此:

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

希望对你有效。:-)


47

我已经为以后的访客添加了此功能,因为这是一个非常积极的问题。

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。您将注意到这一点并注释掉它,而不是将其挂起。


4
正是我想要的。谢谢!!
Ricky 2014年

碰到一个8年的老答案,说,如果您想要一个单线而不是一个bat文件,则可以在构建后事件字符串的末尾添加“&exit 0”。
埃里克·吴

46

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


救了我一个小时,谢谢!从互联网下载了一些代码,Windows 7将文件夹自动设置为只读。
约翰·彼得森,

1
我还使用了xcopy并带有/ y标志。所有的命令microsoft.com/resources/documentation/windows/xp/all/proddocs/...
约翰·彼得森

11

SysInternals 获取进程监视器,将其设置为监视Lunaverse.DbVerse(在“路径”字段上)以查看操作结果。从那里可以清楚地发现出了什么问题


8

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


5

针对这一情况,谁使用“ 副本在”命令生成事件预生成事件命令行或/和生成后事件命令行的)项目- >属性:你“ 复制 ”命令参数应该像在这里:copy "source of files" "destination for files"。请记住使用引号(以避免地址字符串中的空格出现问题)。


4

我有一个类似的问题,但特别是在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创建的文件夹始终都是只读的。为什么它可以在我的机器上但不能在服务器上复制很好,这超出了我的范围。
shawn1874年

我只是使用Notepad ++编辑了csproj文件。“ AfterBuild”挂钩是标准挂钩,因此,如果存在,它将在构建过程后自动调用。
TechSavvySam

谢谢。我不确定您是否有一个带有目标的自定义msbuild文件,或者只是Visual Studio创建的文件。仅供参考:就我而言,我发现问题与构建顺序有关。我忘记在发行版和解决方案配置中设置构建依赖项,因此项目以不同的顺序在服务器上构建,因此执行复制时输入文件尚不可用。确保.dll在另一个需要它的项目之前生成,然后为我修复了它。导致它的解决方案配置是一个非常微妙的问题。
shawn1874年

乍一看对于每个配置来说构建顺序并不明显。我认为这更多是一个解决方案设置,但显然您必须在所有配置中更新构建顺序。
shawn1874年

3

我可以通过以管理员身份运行Visual Studio来修复代码1。显然,如果没有Admin,它无权执行Shell命令。



2

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


2

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

c:\projects\%NotAnEnvironmentVariable%

需要成为

c:\projects\%%NotAnEnvironmentVariable%%

2

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


1
顺便说一句,\之后$(SolutionDir)是多余的。
暗黑破坏神”

2

对于那些通过Project-> Properties在构建事件(构建前事件命令行或/和构建后事件命令行)中使用“ copy”命令的用户:目标文件夹应该存在


0

这么多解决方案...

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


0

我遇到了同样的问题,事实证明那是因为我已重命名了该项目。我进入了项目属性,将Assembly Name和Root Namespace更改为项目名称,此后效果很好!


0

另一个答案...

就我而言,我有一个针对.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>

现在可以正常工作,并且有一点小故障,即构建后事件命令行运行了两次,因此文件被复制了两次。


0

就我而言,cd在调用bat文件之前,我必须先(更改目录),因为bat文件内部是一个复制操作,该操作指定了相对路径。

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.