目前我有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磁盘的好处明显超过了它的缺点。
好的,既然我合理地说服了你为什么我想要这个给我路径:)。
答案 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”目录的完整解决方案
<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 环境变量,它将什么也不做。