Visual Studio 解决方案文件中的环境变量

Environment variables in Visual Studio solution files

我有一个 Visual Studio 解决方案,其中包含一个特定项目的以下条目:

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XXXData",
"%XXX_LIBS_DIR%\XXXData\XXXData\XXXData.csproj", "{AA390915-1F94-459F-A3D8-B2027A90A6AF}"
EndProject

这在 Visual Studio 中工作正常,但在使用 MSBUILD 进行构建时失败了,因为您得到:

E:\path\project.sln.metaproj : error MSB2302: The project file
"E:\path\%XXX_LIBS_DIR%\XXXData\XXXData.csproj" was not found

%XXX_LIBS_DIR% 似乎没有被 MSBUILD 翻译,所以找不到项目文件。

我确实尝试用 $(XXX_LIBS_DIR) 替换 %XXX_LIBS_DIR% 但这在 Visual Studio.

中不起作用

有人认为我考虑过预处理解决方案并将 %XXX_LIBS_DIR% 替换为绝对或相对路径,看看是否可行,我想知道是否有比这更好的解决方案?

更新

根据引用的问题,在 VS2019 MSBuild v16.0 上通过 msbuild.exe 修复了 .sln 文件中环境变量的使用。


Environment variables in Visual Studio solution files

这是一个关于 MSBuild 的已知问题,请参阅:

https://github.com/Microsoft/msbuild/issues/120

https://developercommunity.visualstudio.com/content/problem/248631/msbuild-doesnt-parse-environment-variables-in-sln.html

"Currently we are using environment variables to specify where to find projects within our VS solution files. Visual Studio seems to handle this fine but when trying to build the solution via MSBuild, we get an error due to it not parsing the environment variable at all."

MS 团队在 2011 年标记为“不会修复”。

所以,对于这个问题,恐怕没有比给它一个绝对路径或相对路径更好的解决办法了。

希望对您有所帮助。

如@LeoLiu-MSFT 所述,不幸的是,msbuild 不支持解决方案文件中的环境变量。

您需要在构建之前用实际值替换变量。

示例:

# Python 2.7 or 3.7+
# usage: python fix_sln.py path/to/file.sln
import codecs
import os
import re
import shutil
import sys

if __name__ == "__main__":
    with codecs.open(sys.argv[1], encoding='utf-8-sig') as orig:
        with codecs.open(sys.argv[1] + '.modified', 'w', encoding='utf-8-sig') as new:
            for line in orig:
                line = line.rstrip('\r\n')
                found = re.search(r"""%.+%""", line)
                line = line.replace(str(found.group()), os.environ.get(str(found.group()).replace("""%""", ""))) if found else line
                new.write(line + '\r\n')
    shutil.move(sys.argv[1] + '.modified', sys.argv[1])