更改Ram磁盘的Visual Studio构建路径

时间:2017-11-02 09:00:53

标签: visual-studio build visual-studio-2017

目前我有Visual Studio 17 V 15.4.2

是否可以为项目设置不同的构建路径?例如,而不是

C:\Users\[UserName]\source\repos\[MyProject]\[bin|obj]

将其移至

M:\Users\[UserName]\source\repos\[MyProject]\[bin|obj]

请注意,它自己的项目位于C内,但临时文件会移动到其他位置。我有驱动器M这是一个16GB的RAM磁盘。

使用RAM磁盘的好处:(诱使我这样做的原因)

  • 更快的构建时间(没有真正的IO)

  • SSD不会因重复重建而耗尽。

  • 项目本质上是清理的(带来以下好处)

  • 分享得更快,您的项目没有填充不必要的文件,以便您可以轻松地与他人共享文件夹。 (代码大小通常小于1MB,但构建对象可以超过1GB)

  • 快速备份,出于同样的原因,您的项目文件夹始终保持清理状态,您可以更快地备份项目。 (特别是当你有很多项目时,例如你只能备份100MB而不是10GB)

  • 创建锁定文件的可能性较小。 (这会导致构建异构,错误等)在这种情况下格式化ramdisk比使用VS设置或重新启动它更容易。

缺点:

  • 你需要更多内存,在我的情况下我有32GB,我可以为它节省16GB。

  • 如果您重置VS或计算机,则会丢失编译对象并且必须重建(一次)

但使用RAM磁盘的好处明显超过了它的缺点。

好的,既然我合理地说服了你为什么我想要这个给我路径:)。

2 个答案:

答案 0 :(得分:0)

可以更改应使用bin-path和obj-path的项目文件(至少对于.NET应用程序而言)。但是您需要在每个项目上手动更改此设置。而且,如果您检查这些更改,可能会给尝试构建的其他人带来麻烦。

相反,您将bin和obj目录更改为指向虚拟磁盘的符号链接。这不会影响您的项目和解决方案文件(除了git可能将此链接视为文件,因此您可能希望将它们添加到.gitignore中。)

我创建了两个Powershell脚本来进行管理。我在解决方案文件所在的目录中运行这些文件。请注意,运行这些目录时将删除bin-和obj目录。

此脚本将删除csproj文件所在的所有目录中的bin文件夹和obj文件夹,并将其替换为符号链接:

$ramDiskDrive = "R:"

# Find all project files...
$projectFiles = Get-ChildItem -Filter *.csproj -Recurse 
# Get project directories
$projectDirectories = $projectFiles | ForEach-Object { $_.DirectoryName } | Get-Unique


# Create a bin-directory on the RAM-drive
$projectDirectories | ForEach-Object { New-Item -ItemType Directory -Force -Path "$ramDiskDrive$($_.Substring(2))\bin" } 

# Remove existing bin-directories
$projectDirectories | ForEach-Object { Remove-Item "$($_)\bin" -Force -Recurse }

# Link bin-directories to ramdisk
$projectDirectories | ForEach-Object { cmd /c mklink /D "$($_)\bin" "$ramDiskDrive$($_.Substring(2))\bin" }


# Create a obj-directory on the RAM-drive
$projectDirectories | ForEach-Object { New-Item -ItemType Directory -Force -Path "$ramDiskDrive$($_.Substring(2))\obj" } 

# Remove existing obj-directories
$projectDirectories | ForEach-Object { Remove-Item "$($_)\obj" -Force -Recurse }

# Link obj-directories to ramdisk
$projectDirectories | ForEach-Object { cmd /c mklink /D "$($_)\obj" "$ramDiskDrive$($_.Substring(2))\obj" }

此脚本将删除符号链接:

# Find all project files...
$projectFiles = Get-ChildItem -Filter *.csproj -Recurse 
# Get project directories
$projectDirectories = $projectFiles | ForEach-Object { $_.DirectoryName } | Get-Unique


# Unlink bin-directories to ramdisk
$projectDirectories | ForEach-Object { cmd /c rmdir "$($_)\bin"   }

# Unlink obj-directories to ramdisk
$projectDirectories | ForEach-Object { cmd /c rmdir "$($_)\obj"   }

如果两次运行相同的脚本,则会收到错误消息,但是可以忽略这些错误消息。

所有这些,根据我的经验,使用RAM磁盘而不是SSD驱动器并没有太大区别。它速度更快,但没有您期望的那么快。

答案 1 :(得分:0)

“obj”目录的完整解决方案

  1. 创建指向您的 ramdrive 的 EnviromentVariable BUILD_RAMDRIVE。
  2. 使用以下内容在解决方案目录中创建“Directory.Build.props”文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <BuildRamdrive>$([System.Environment]::GetEnvironmentVariable("BUILD_RAMDRIVE",System.EnvironmentVariableTarget.Machine))</BuildRamdrive>
    </PropertyGroup>
    <PropertyGroup Condition=" '$(BuildRamdrive)' != '' AND '$(MSBuildProjectFile)' != ''">
        <BaseIntermediateOutputPath>$(BuildRamdrive)\Projects\$(SolutionName)\$(MSBuildProjectFile)\obj\</BaseIntermediateOutputPath>
        <IntermediateOutputPath>$(BuildRamdrive)\Projects\$(SolutionName)\$(MSBuildProjectFile)\obj\$(Configuration)\</IntermediateOutputPath>
        <MSBuildProjectExtensionsPath>$(BuildRamdrive)\Projects\$(SolutionName)\$(MSBuildProjectFile)\obj\</MSBuildProjectExtensionsPath>
    </PropertyGroup>
</Project>

仅此而已:-)

此 MSBuild 脚本从您的计算机中获取 BUILD_RAMDRIVE 环境变量。然后将此解决方案中所有项目的所有 obj 文件重定向到 $BUILD_RAMDRIVE\Projects\$(SolutionName)\$(MSBuildProjectFile)\obj\ 目录

如果您的计算机没有 BUILD_RAMDRIVE 环境变量,它将什么也不做。