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
和
"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])
我有一个 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
和
"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])