【问题标题】:Environment variables in Visual Studio solution filesVisual Studio 解决方案文件中的环境变量
【发布时间】:2018-06-15 14:20:07
【问题描述】:

我有一个 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% 替换为绝对或相对路径,看看是否可行,我想知道是否有比这更好的解决方案?

【问题讨论】:

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


    【解决方案1】:

    更新

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


    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 年标记为“不会修复”。

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

    希望这会有所帮助。

    【讨论】:

    • 我的解决方案是用一个在 MSBUILD 运行之前运行的简单应用程序将 %XXX...% 替换为绝对值。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2015-11-28
      • 2011-01-21
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多