如何在Visual Studio中设置Output和Intermeidate目录依赖于当前的git分支?

kov*_*rex 3 git compilation visual-studio git-branch

我正在寻找一个解决方案,以避免在git中从分支移动到分支时进行大量重新编译.为不同的分支使用不同的文件夹是解决方案,但它只是在我的工作流程中创建了混乱.

我能想到的最好的解决方案是将git分支作为项目设置中使用的选项$变量传递,因此我可以将"输出目录"设置为类似

..\bin\$(branch)\$(Configuration)$(Platform)\
Run Code Online (Sandbox Code Playgroud)

与中间目录类似.

这样的事情可以配置吗?

编辑:问题是,即使每个分支的输出/中间目录不同(或在更改分支时从存档移动),仍然会重新编译预编译的头文件,因此项目也会重新编译.

Lan*_*dys 5

解决方案1

我认为OP的使用$(branch)方式很酷.但是无法使用分支名称的动态值创建用户宏Visual Studio.Visual Studio如果我们pre-build在VS启动后在事件中添加环境变量,则要么重新加载环境变量要么是不可能的,除非它重新启动.看起来最简单的方法就是如上所述post-checkoutgit存储库中挂钩@ConfusedSushi.

我刚刚测试了解决方案,效果很好.详情如下所示.

创建git hook post-checkout(文件名只是post-checkout,并将其放入GIT_DIR/.git/hooks.它将调用批处理文件set-branch.bat.

#!/bin/bash

if [ "$3" -eq "1" ]; then
    cmd.exe /c "`pwd`/.git/hooks/set-branch.bat" 
fi
Run Code Online (Sandbox Code Playgroud)

批处理文件set-branch.bat如下.并把它放进去GIT_DIR/.git/hooks.

@echo off

for /f %%i in ('git rev-parse --abbrev-ref HEAD') do setx branch %%i
Run Code Online (Sandbox Code Playgroud)

然后设置Output directory为OP做了:

..\bin\$(branch)\$(Configuration)$(Platform)\
Run Code Online (Sandbox Code Playgroud)

现在,每次更改分支时git check,branch都会设置一个环境变量.您需要重新启动Visual Studio才能获得环境变量值.它只是按你的需要工作.

解决方案2

由于OP的评论,另一个解决方案是让visual studio使用相同的文件夹,但在post-checkout钩子中移动Output/intermediate目录.

只需post-checkout使用以下脚本创建一个git hook .并使用您自己的真实文件夹替换下面的测试文件Test/Test/Debug夹.它可以是绝对目录或与git存储库相关.如果构建文件夹branch name不是当前分支,则它将作为后缀添加.

#!/bin/bash

build_folder=Test/Test/Debug
if [ "$3" -eq "1" ]; then
    oldref=$(git reflog | awk 'NR==1{ print $6; exit }')
    newref=$(git rev-parse --abbrev-ref HEAD)

    if [ "$oldref" != "$newref" ]; then
        if [ -d "$build_folder-$oldref" ]; then
            rm -rf "$build_folder-$oldref"
            echo "Deleted $build_folder-$oldref"
        fi

        if [ -d "$build_folder" ]; then
            mv "$build_folder" "$build_folder-$oldref"
            echo "Moved $build_folder to $build_folder-$oldref"
        fi

        if [ -d "$build_folder-$newref" ]; then
            mv "$build_folder-$newref" "$build_folder"
            echo "Moved $build_folder-$newref to $build_folder"
        fi
    fi
fi
Run Code Online (Sandbox Code Playgroud)

[已更新]对于已编辑的问题,由于预编译的标题在切换分支时总是会更改,因此始终会重新编译项目.实际上有一个解决方案,但有点危险.

VS检测modified time源文件以确定是否需要重新编译.所以我们能做的就是改变modified time作弊VS.我们可以用命令来做touch.

但很难确定哪个时间合适.为了使其实用,我们可以选择一个不通过切换分支而变化的文件,并且也相对稳定,并将modified time预编译头文件设置为与所选文件相同.我们也可以在post-checkout钩子里做.

touch -r some_stable_chosen_file precompiled_header
Run Code Online (Sandbox Code Playgroud)

但我们应该记住它不安全,因为它也可能忽略对预编译头文件的真正更改.我们必须手动处理它.