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



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

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

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

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

看起来 %XXX_LIBS_DIR% 未由 MSBUILD 翻译,因此找不到项目文件。

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

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

更新

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


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

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

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

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

"目前,我们正在使用环境变量来指定在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('rn')
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 + 'rn')
shutil.move(sys.argv[1] + '.modified', sys.argv[1])

最新更新