创建符号链接而不是将内容复制到输出目录

3
假设我有一个包含50个C#项目的Visual Studio解决方案。 Project 1有一个本地DLL,从Project 1中加载。
所有其他项目都依赖于Project 1
本地DLL的大小为200 MB,并且设置了Copy to Output DirectoryCopy if newer
当我构建此解决方案时,Project 1的内容会被复制到所有项目的bin\Debugbin\Release文件夹中。因此,我有100个副本大小为200 MB的本地DLL。总共20 GB。
如何避免解决方案目录的巨大大小?如果我可以避免复制Project 1的内容并改用符号链接,那将是不错的。但我找不到方法。

本地 DLL 的“生成操作”设置为“内容”。 - Wollmich
ReFS可能是一个解决方案吗?请参阅https://learn.microsoft.com/en-us/windows-server/storage/refs/block-cloning - Wollmich
ReFS块克隆似乎无法正常工作,请参见https://superuser.com/questions/1762696/refs-block-cloning-use-command-line-to-copy-a-file-and-use-block-cloning。 - Wollmich
3个回答

2

不确定是否符合您的需求,但您可以“指示”MSBuild(在Visual Studio内部构建时无效)使用硬链接,而不是实际文件复制。

有许多属性会影响相应的行为,当设置为true时:

  • CreateHardLinksForCopyFilesToOutputDirectoryIfPossible
  • CreateHardLinksForCopyAdditionalFilesIfPossible
  • CreateHardLinksForCopyLocalIfPossible
  • CreateHardLinksForPublishFilesIfPossible

基本上,它们在特定情况下设置了给定情况下Copy任务的UseHardlinksIfPossible属性,因此您也可以使用这个指令来指导自己的Copy-Task使用。

另一个选择是为所有项目使用共同的输出目录。然而,这也有它自己的一系列影响(通过搜索“UseCommonOutputDirectory”获取更多信息)。


使用命令行和任何或所有属性的msbuild都不能解决我本地DLL的问题。 _CopyOutOfDateSourceItemsToOutputDirectory下的文件仍然会被复制。 - Wollmich
使用以下命令 msbuild Solution.sln -t:Build /p:Configuration=Debug /p:CreateHardLinksForAdditionalFilesIfPossible=true 会为本机DLL生成硬链接。请参阅 https://referencesource.microsoft.com/#MSBuildFiles/C/ProgramFiles(x86)/MSBuild/14.0/bin_/amd64/Microsoft.Common.CurrentVersion.targets,4089 - Wollmich

2
为了自动应用优化设置到所有项目中,需要在解决方案的根目录下创建一个名为Directory.Build.props的文件,并使用以下内容:
<Project>
    <PropertyGroup>
        <!--
        Use hard links to speed up build.
        NOTE: This means dependencies' files might be locked on execute as well, so re-building them while the application is running might fail.
        -->
        <CreateHardLinksForAdditionalFilesIfPossible>true</CreateHardLinksForAdditionalFilesIfPossible>
        <CreateHardLinksForCopyLocalIfPossible>true</CreateHardLinksForCopyLocalIfPossible>
        <CreateHardLinksForCopyFilesToOutputDirectoryIfPossible>true</CreateHardLinksForCopyFilesToOutputDirectoryIfPossible>
        <CreateHardLinksForPublishFilesIfPossible>true</CreateHardLinksForPublishFilesIfPossible>
    </PropertyGroup>
</Project>

可以在POSIX shell中运行ls -la bin/Debug/net7.0命令并查看第二列的数字来验证效果,该数字是硬链接计数器,应该大于1。对于Windows系统,可以使用Sysinternals的FindLinks工具


0

我对符号链接不熟悉。但是你可以看看this:

运行时,程序集必须位于两个位置之一:项目的输出路径或全局程序集缓存。

您可以使用全局程序集缓存 并在 Visual Studio 中将“Copy Local”属性设置为 No: enter image description here

bin\debug 文件夹会更加干净: enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接