使用网络上引用的程序集生成
本文关键字:程序集 引用 网络 | 更新日期: 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 分钟就有新的程序集,因此我们始终使用最新的内部程序集进行构建。甚至构建服务器也是这样设置的。我不能保证这对你有用,但它肯定会减轻网络的负担。