使用网络上的引用程序集构建

时间:2011-04-06 15:32:10

标签: c# visual-studio msbuild

我们正在开始一个新项目,我们希望将一些程序集引用放在网络驱动器上(将来,这些程序集将被构建服务器“删除”到网络位置)。

我原本以为我读过Visual Studio对网络位置很聪明的地方,当它检测到网络驱动器上的程序集时,它会在本地复制程序集,只有在程序集发生变化时才更新它。我似乎无法复制这种行为 - 每次构建(甚至是“正常”构建,而不是重建)时,VS都会从网络连接重新下载引用的程序集。如果您的连接恰好通过VPN连接,您可以真正感受到它(将分钟添加到构建时间)。

我的VS构建行为是错误的,还是我需要做些什么才能启用它?

3 个答案:

答案 0 :(得分:2)

这是another option for you。基本上添加一个预构建事件,用于检查网络位置程序集是否较新。

答案 1 :(得分:2)

将引用保留在本地,但引入预构建步骤以使用robocopy在本地复制它们。 Robocopy是Vista中的操作系统的一部分,可以作为以前版本的Windows(如XP)中资源工具包的一部分安装。

这是一个调用robocopy的msbuild目标:

  <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>

答案 2 :(得分:0)

我可以推荐的是我们公司使用的程序。我们有一个内部程序集的联网存储库,我们称之为\\AssembliesRepository。但是,我们不直接引用它(如果丢失网络连接会发生什么?)。相反,每台计算机都有一个本地文件夹,让我们使用C:\Assemblies来镜像\\AssembliesRepository。我们使用SyncToy来处理两个位置的镜像,并使用任务计划程序以我们认为合适的任何时间间隔运行SyncToy(目前在工作日期间每15分钟运行一次)。使用此设置,我们永远不需要直接访问\\AssembliesRepository,我们只需删除本地文件夹中的程序集,SyncToy将处理其余部分。我们每15分钟就有一个新组件,因此我们始终使用最新的内部组件构建。甚至构建服务器也是这样设置的。我不能保证这对你有用,但它无论如何都会减轻网络负担。