代码之家  ›  专栏  ›  技术社区  ›  Yanshof

如何通过编译后事件将include文件夹复制到bin文件夹?

  •  0
  • Yanshof  · 技术社区  · 6 年前

    我正在处理一个项目,该项目要求通过构建解决方案生成的dll从bin文件夹复制到另一个文件夹,这两个文件夹都在我的计算机上,在我的c驱动器中。我已经编写了一个批处理文件,它使用xcopy来完成此任务,您可以在这里看到:

    xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
    xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"
    

    现在,我已经尝试了这个文件的多次迭代,它位于:

    C:\Users\scogan\Desktop\CopyFiles.bat
    

    因此,我的后期生成事件命令行如下所示:

    call C:\Users\scogan\Desktop\CopyFiles.bat
    

    我自己运行这个批处理文件,在桌面上的文件夹中有两个文本文件,它运行得很好。我也运行了它,因为它是我需要复制自己的文件,这也很好。但是,当我尝试将此作为生成后事件运行时,会得到以下输出:

    1>  Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
    1>  File not found - Organizr.Services.dll
    1>  0 File(s) copied
    1>  0 File(s) copied
    1>  File not found - Organizr.Services.pdb
    1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.
    

    我做了一些研究,发现错误代码4表示“发生初始化错误”。内存或磁盘空间不足,或者在命令行中输入了无效的驱动器名或无效语法。”

    我也查过什么是msb3073,并没有真正找到什么可以帮助我那里。所以,我的问题是我做错了什么?绝对路径会把它弄乱吗?感谢您的帮助。

    0 回复  |  直到 11 年前
        1
  •  23
  •   Sean Cogan    11 年前

    在处理不同的项目属性时,我发现问题出在项目构建顺序上。生成我要复制的文件的项目是生成的 第二 ,但将批处理文件作为生成后事件运行的项目已生成 第一 ,所以我只是将构建事件附加到第二个项目,它工作得很好。不过,谢谢大家的帮助。

        2
  •  15
  •   Nicodemeus    11 年前

    与生成后事件相比,更喜欢在afterbuild目标中生成msbuild“copy”任务。

    将此目标追加到项目文件中并删除PostBuildEvent。

    <Target Name="AfterBuild">
        <Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*" 
              DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\" 
              OverwriteReadOnlyFiles="true" 
              SkipUnchangedFiles="false" />
    </Target>
    
        3
  •  9
  •   darda    9 年前

    值得一提的是,在我的例子中,问题是由于在 copy 命令。必须使用反斜杠。

        4
  •  5
  •   ashish    8 年前

    在我的例子中,通过构建项目创建的dll仍在后台使用。我终止了应用程序,然后xcopy按预期运行良好。

        5
  •  3
  •   Pankaj Chouthmal    6 年前

    指定的错误与后生成事件相关。不知何故vs tool无法将文件复制到目标文件夹。可能有很多原因。要检查错误的确切原因,请转到 工具>选项>项目和解决方案>生成并运行 ,并更改“ msbuild项目生成输出详细信息 “到” 诊断的 “。它将提供足够的信息来检测实际问题。

        6
  •  3
  •   J. Scott Elblein roon    5 年前

    这已经太晚了,但是我的经验可以让大家以后再看:

    在ms vs 2010中,我也遇到了同样的问题。它是通过在包含空格的post-build-copy命令参数中添加引号来解决的!

    Project Properties --> Configuration Properties --> Build Events --> Post-Build Event --> Command Line 更改:

    copy $(ProjectDir)a\b\c $(OutputPath)

    copy "$(ProjectDir)a\b\c" "$(OutputPath)"

        7
  •  1
  •   Pandele Florin    8 年前

    如果问题仍然存在,甚至在将after build放入正确的项目之后,请尝试使用“copy”而不是xcopy。这对我有效。

        8
  •  1
  •   Laurie Stearn    6 年前

    导入项目的生成后事件(在“属性”对话框的“生成事件”下)具有未定义的环境变量。
    导航到 Control Panel\All Control Panel Items\System\Advanced system settings 添加适当的 environment variable, and doing no more 重新启动VS2017解决了这个错误。
    另外,从 @Seans 以及关于多个项目竞赛/争论的其他答案,在output文件夹中创建一个temp文件夹,如下所示,

    like so

    并选择产生首选输出的项目:

    enter image description here

    构建(不重建/清理)是一个快速的解决方案。

        9
  •  1
  •   suraj kumar    6 年前

    如果遇到copy命令的问题,在运行copy命令之前应该执行以下操作

    1. 以管理员身份打开解决方案并生成解决方案。
    2. 如果出现“0个文件已复制”之类的问题,请检查源和目标路径。可能你走错了路。如果您在“command prompt”中运行相同的命令来检查它是否正常工作,则效果会更好。
        10
  •  1
  •   J. Scott Elblein roon    5 年前

    我通过以下方法解决了这个问题:

    在visual studio中,我加入了 Project -> Project Dependencies

    我选择了 XXX.Test 解决方案并告诉它它还取决于 XXX 解决方案使 post-build 中的事件 XXX.测试 解决方案未生成此错误(退出时使用 code 4 )中。

        11
  •  0
  •   Awan    8 年前

    我的测试项目也有同样的问题。我发现了我的后期生成事件不起作用的原因,这是因为我在运行$(projectname).exe命令之前正在复制文件,其中一些文件是测试项目本身所必需的。因此,只要移动$(projectname).exe作为第一个命令就可以解决这个问题。

        12
  •  0
  •   J. Scott Elblein roon    5 年前

    我发现当多个项目并行构建,并且一个或多个项目试图复制相同的文件,从而创建会导致偶尔错误的竞争条件时,就会出现问题。那么如何解决呢?

    有很多选择,因为以上只是改变周围的事情可以解决一些人的问题。更可靠的解决方案是…

    • 限制要复制的文件,即 xcopy $(TargetDir)*.*" …相反地 xcopy "$(TargetDir)$(TargetName).*"

    • 捕获错误并重试,即:

        :loop
        xcopy /Y /R /S /J /Q  "$(TargetDir)$(TargetName).*" "somewhere"
        if ErrorLevel 1 goto loop
    
    • 使用robocopy而不是xcopy

    • 您可能不想这样做,因为这样会增加生成时间,但是您可以将并行项目生成的最大数量减少到 1个

    enter image description here