Сборки со ссылочными сборками в сети - PullRequest
0 голосов
/ 06 апреля 2011

Мы начинаем новый проект и хотели бы поместить некоторые ссылки на сборки на сетевой диск (в будущем эти сборки будут «сброшены» сервером сборки в сетевое расположение).

Мне показалось, что я где-то читал, что Visual Studio хорошо разбирается в сетевых расположениях и что при обнаружении сборки на сетевом диске она будет копировать сборку локально и обновлять ее только в случае изменения сборки.Однако я не могу воспроизвести это поведение - каждый раз, когда я собираю (даже "нормальную" сборку, а не перестройку), VS повторно загружает ссылочные сборки из сетевого соединения.Если ваше соединение происходит через VPN, вы действительно можете почувствовать это (добавляет минут ко времени сборки).

Был ли я не прав в поведении сборки VS, или есть что-то, что янужно сделать чтобы включить?

Ответы [ 3 ]

2 голосов
/ 06 апреля 2011

Вот другой вариант для вас . В основном добавление события перед сборкой, которое проверяет, являются ли сборки сетевого расположения более новыми.

2 голосов
/ 07 апреля 2011

Храните ссылки локально, но вводите предварительный шаг, чтобы скопировать их локально, используя robocopy. Robocopy является частью ОС в Vista и далее и может быть установлен как часть набора ресурсов в предыдущей версии Windows (например, XP).

Вот цель msbuild для вызова robocopy:

  <Target Name="SyncReferences">

    <Message Text="RemoteReferencesRoot:$(RemoteReferencesRoot)" />
    <Message Text="LocalReferencesRoot:$(LocalReferencesRoot)" />

    <!-- ensure required properties are set -->
    <Error Condition="'$(RemoteReferencesRoot)'==''" Text="RemoteReferencesRoot property not set." />
    <Error Condition="'$(LocalReferencesRoot)'==''" Text="LocalReferencesRoot property not set." />

    <!-- Robocopy can't handle trailing slash nicely the way we're going to call it -->
    <Error Condition="HasTrailingSlash('$(RemoteReferencesRoot)')" Text="RemoteReferencesRoot has a trailing slash.  '$(RemoteReferencesRoot)'" />
    <Error Condition="HasTrailingSlash('$(LocalReferencesRoot)')" Text="LocalReferencesRoot has a trailing slash.  '$(LocalReferencesRoot)'" />

    <!-- ensure source and target directories exist -->
    <Error Condition="!Exists('$(RemoteReferencesRoot)')" Text="$(RemoteReferencesRoot) does not exist." />
    <Error Condition="!Exists('$(LocalReferencesRoot)')" Text="$(LocalReferencesRoot) does not exist." />

    <!-- remember to ignore the exit code as robocopy can return values other than 0 -->
    <Exec Command='Robocopy /mir /z "$(RemoteReferencesRoot)" "$(LocalReferencesRoot)"' IgnoreExitCode='true'>
      <Output PropertyName="RoboCopyExitCode" TaskParameter="ExitCode"/>
    </Exec>

    <Message Text="RoboCopyExitCode:$(RoboCopyExitCode)" />

    <!--Robocopy exit code:--> 
    <!-- 0  No errors occurred and no files were copied.--> 
    <!-- 1  One of more files were copied successfully.--> 
    <!-- 2  Extra files or directories were detected.  Examine the log file for more information.--> 
    <!-- 4  Mismatched files or directories were detected.  Examine the log file for more information.--> 
    <!-- 8  Some files or directories could not be copied and the retry limit was exceeded.--> 
    <!-- 16 Robocopy did not copy any files.  Check the command line parameters and verify that Robocopy has enough rights to write to the destination folder.--> 
    <Error Condition="$(RoboCopyExitCode)>3" Text="Robocopy returned exit code '$(RoboCopyExitCode)' which indicates a failure." />

  </Target>
0 голосов
/ 06 апреля 2011

Я могу порекомендовать вам процедуру, которую мы используем в моей компании. У нас есть сетевой репозиторий внутренних сборок, назовем его \\AssembliesRepository. Однако мы не ссылаемся на него напрямую (что произойдет, если вы потеряете подключение к сети?). Вместо этого у каждой машины есть локальная папка, например, C:\Assemblies, которая отражает \\AssembliesRepository. Мы используем SyncToy для обработки зеркалирования двух местоположений и планировщика задач для запуска SyncToy с любым интервалом, который мы считаем подходящим (в настоящее время каждые 15 минут в течение рабочего дня). Используя эту настройку, нам никогда не нужен прямой доступ к \\AssembliesRepository, мы просто удаляем сборки в локальную папку, а SyncToy обрабатывает все остальное. Каждые 15 минут у нас появляются новые сборки, поэтому мы всегда собираем последние внутренние сборки. Даже сервер сборки настроен таким образом. Я не могу обещать, что это работает для вас, но в любом случае это снижает нагрузку на сеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...