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

时间:2018-06-15 14:20:07

标签: visual-studio-2015 msbuild environment-variables solution

我有一个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

看起来MSBUILD没有翻译%XXX_LIBS_DIR%,因此无法找到项目文件。

我确实尝试用$(XXX_LIBS_DIR)替换%XXX_LIBS_DIR%但是这在Visual Studio中不起作用。

我考虑的一个想法是预先处理解决方案并用绝对路径或相对路径替换%XXX_LIBS_DIR%,看看是否有效,我想知道是否有比这更好的解决方案?

2 个答案:

答案 0 :(得分:1)

  

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

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

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

并且

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

  

“目前我们正在使用环境变量来指定在VS解决方案文件中找到项目的位置.Visual Studio似乎处理得很好但是在尝试通过MSBuild构建解决方案时,由于它没有解析环境而导致错误变量。“

MS团队在2011年标记为“无法修复”。

因此,对于这个问题,我担心没有更好的解决方案来解决这个问题,而不是给它一个绝对或相对的路径。

希望这有帮助。

答案 1 :(得分:0)

正如@ 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])