我们正在开始一个新项目,我们希望将一些程序集引用放在网络驱动器上(将来,这些程序集将被构建服务器“删除”到网络位置)。
我原本以为我读过Visual Studio对网络位置很聪明的地方,当它检测到网络驱动器上的程序集时,它会在本地复制程序集,只有在程序集发生变化时才更新它。我似乎无法复制这种行为 - 每次构建(甚至是“正常”构建,而不是重建)时,VS都会从网络连接重新下载引用的程序集。如果您的连接恰好通过VPN连接,您可以真正感受到它(将分钟添加到构建时间)。
我的VS构建行为是错误的,还是我需要做些什么才能启用它?
答案 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分钟就有一个新组件,因此我们始终使用最新的内部组件构建。甚至构建服务器也是这样设置的。我不能保证这对你有用,但它无论如何都会减轻网络负担。