使用网络上引用的程序集生成

本文关键字:程序集 引用 网络 | 更新日期: 2023-09-27 17:48:55

我们正在启动一个新项目,我们希望将一些程序集引用放在网络驱动器上(将来,这些程序集将由生成服务器"删除"到网络位置)。

我曾以为我在某处读到Visual Studio对网络位置很聪明,当它检测到网络驱动器上的程序集时,它会在本地复制程序集,并且仅在程序集更改时才更新它。 不过,我似乎无法复制这种行为——每次我构建(即使是"正常"构建,而不是重建),VS 都会从网络连接重新下载引用的程序集。 如果您的连接恰好通过 VPN,您可以真正感受到它(增加构建时间)。

我对 VS 的构建行为有误,还是我需要做些什么来启用它?

使用网络上引用的程序集生成

将引用保留在本地,但引入一个预构建步骤,以使用 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>

这是您的另一个选择。基本上添加一个预生成事件,用于检查网络位置程序集是否较新。

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