Почему Robocopy пропускает файл во время сборки?
Я добавил файл robocopy к своему событию пост-сборки в моем проекте C#. X64 Release и Debug строят нормально, как и X86 Debug, однако опция X86 Release НЕ копирует файл Get-Parent-Device.exe в цель.
Зачем?
Примечание: я всегда могу просто добавить шаг и скопировать файл вручную только для этой конкретной конфигурации, и это "решит" мою проблему, однако я хочу понять, какая проблема возникла у robocopy. Источник и назначение в порядке, разрешения в порядке, просто X86/Release не работает.
Что интересно, если я щелкну правой кнопкой мыши на решении и выберу сборку, robocopy будет работать с этой конфигурацией. Что не работает, так это если я использую Visual Build Professional и собираю все конфигурации проекта.
Вот лог + файл:
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Tuesday, September 25, 2018 10:16:57 AM
Source : C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\Get-Parent-Device\Release\
Dest : C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\bin\x86\Release\
Files : Get-Parent-Device.exe
Options : /V /DCOPY:DA /COPY:DAT /IS /R:1000000 /W:30
------------------------------------------------------------------------------
0 C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\Get-Parent-Device\Release\
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 0 1 0 0 0
Files : 0 0 0 0 0 0
Bytes : 0 0 0 0 0 0
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Ended : Tuesday, September 25, 2018 10:16:57 AM
Вот соответствующие шаги из события пост-сборки:
robocopy /V /IS /log+:"$(TargetDir)robo.log" "$(ProjectDir)..\Get-Parent-Device\Release" $(TargetDir) Get-Parent-Device.exe
robocopy "$(ProjectDir)..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\$(PlatformName)" $(TargetDir) SQLite.Interop.dll
exit 0
Вот скриншот шагов сборки.
Я видел рекомендацию использовать /MIR, но я не хочу отражать, просто скопируйте этот конкретный файл. К сожалению, /log, /log+ и /v не дают очень подробной информации о том, почему в этом конкретном случае robocopy чувствовал необходимость не копировать файл.
Я не люблю подметать проблему под ковром или разбираться в технических проблемах, отсюда и мой пост здесь. Меня беспокоит то, что если я не могу положиться на Robocopy, то это может быть плохим выбором для использования в Visual Studio. Мне нужна надежная копия, а не ненадежная.
XCOPY TRIAL:
Это не сработало. До сих пор лучшим решением по-прежнему остается инструкция Visual Build Pro для этой конкретной конфигурации.:-(
PostBuildEvent:
"C:\Program Files\Editors\VisBuildPro9\Tools\signtool.exe" sign /f "C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\jmrDigicert-2017-NoChain.pfx" /p 1234 /t http://timestamp.verisign.com/scripts/timstamp.dll "C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\bin\x64\Debug\MyProject.exe"
xcopy /i "C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\..\Get-Parent-Device\Release\Get-Parent-Device.exe" C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\bin\x64\Debug\
robocopy "C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\x64" C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\bin\x64\Debug\ SQLite.Interop.dll
robocopy "C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\..\..\Redistributables" C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\bin\x64\Debug\ AMBackup.exe
exit 0
Done Adding Additional Store
Successfully signed and timestamped: C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\bin\x64\Debug\MyProject.exe
C:\Users\Sarah\Source\Workspaces\MyProject\Flavor\Net\1.0\App\MyProject\..\Get-Parent-Device\Release\Get-Parent-Device.exe
1 File(s) copied
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
1 ответ
Robocopy предназначен только для копирования измененных файлов, но добавленная опция /IS предполагает копирование того, что вам нравится. Попробуйте добавить параметр /IT (включая "подправленные" файлы), но, по моему опыту, это тоже ненадежно.
Этот пост Как заставить Robocopy перезаписывать файлы? подтвердить мои выводы. Их решение было таким же, как у меня: используйте XCOPY.
В этой https://superuser.com/questions/314503/what-does-robocopy-mean-by-tweaked-lonely-and-extra/445137 таблице показано, как Robocopy группирует файлы.
Редактировать:
Как правило, вы получаете сообщение об ошибке "файл не существует" в источнике.
Поскольку ваш тест XCOPY также не прошел, я на 100% уверен, что файл не существует.
Пример ниже:
C:\>dir x
Volume in drive C has no label.
Volume Serial Number is CE46-5CC1
Directory of C:\x
25.09.2018 23:37 <DIR> .
25.09.2018 23:37 <DIR> ..
27.07.2016 15:09 1 209 somefile
1 File(s) 1 209 bytes
2 Dir(s) 125 137 285 120 bytes free
C:\>robocopy /IS x y somefile
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : tirsdag 25. september 2018 23:38:07
Source : C:\x\
Dest : C:\y\
Files : somefile
Options : /DCOPY:DA /COPY:DAT /IS /R:1000000 /W:30
------------------------------------------------------------------------------
1 C:\x\
100% New File 1209 somefile
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 0 1 0 0 0
Files : 1 1 0 0 0 0
Bytes : 1.1 k 1.1 k 0 0 0 0
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Speed : 1209000 Bytes/sec.
Speed : 69.179 MegaBytes/min.
Ended : tirsdag 25. september 2018 23:38:07
C:\>robocopy /IS x y somefile
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : tirsdag 25. september 2018 23:38:13
Source : C:\x\
Dest : C:\y\
Files : somefile
Options : /DCOPY:DA /COPY:DAT /IS /R:1000000 /W:30
------------------------------------------------------------------------------
1 C:\x\
100% Same 1209 somefile
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 0 1 0 0 0
Files : 1 1 0 0 0 0
Bytes : 1.1 k 1.1 k 0 0 0 0
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Speed : 1209000 Bytes/sec.
Speed : 69.179 MegaBytes/min.
Ended : tirsdag 25. september 2018 23:38:13
C:\>robocopy /IS x y somefilex
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : tirsdag 25. september 2018 23:38:17
Source : C:\x\
Dest : C:\y\
Files : somefilex
Options : /DCOPY:DA /COPY:DAT /IS /R:1000000 /W:30
------------------------------------------------------------------------------
0 C:\x\
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 0 1 0 0 0
Files : 0 0 0 0 0 0
Bytes : 0 0 0 0 0 0
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Ended : tirsdag 25. september 2018 23:38:17
C:\>
Я столкнулся с симметричными проблемами при сборке в Visual Studio. Но мне пришлось изменить зависимости сборки и порядок сборки, чтобы решить эту проблему.
Вы можете попытаться добавить небольшую задержку в пост сборки, попробуйте добавить как:
ping 127.0.0.1 -n 3 > nul
Он остановится на 2 секунды, прежде чем продолжить...