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

Visual studio 2015 Visual Studio解决方案文件中的环境变量,visual-studio-2015,msbuild,environment-variables,solution,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构建时会遇到问题,如下所示

我有一个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\u LIBS\u DIR%,因此找不到项目文件

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

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

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

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

“当前,我们正在使用环境变量指定在VS解决方案文件中查找项目的位置。Visual Studio似乎可以很好地处理此问题,但在尝试通过MSBuild生成解决方案时,由于它根本没有解析环境变量,我们收到了一个错误。”

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])

我的解决方案是使用在MSBUILD运行之前运行的简单应用程序将%XXX…%替换为绝对值。