Чем MSBuildToolsPath отличается от MSBuildBinPath ?
В справке написано, что первая более новая, а вторую не надо использовать, потому что она устаревшая. Но мне интересна не эта информация, а причина, по которой нужно было вводить другую переменную.
Справка говорит "$(MSBuildToolsPath) is the version-specific replacement for $(MSBuildBinPath).".
Здесь мне не ясно, что именно за версия, от которой зависит значение этой переменной.
Понятно, что для одной версии чего-то значение переменной будет одно, а для другой версии чего-то значение будет другое.
Дальше там табличка, пары значений "ToolsVersion" и путей.
Мне непонятно как это всё работает. Я могу предположить, что если я через параметр командной строки msbuild
(by using the /ToolsVersion switch (or /tv, for short) when you build the project or solution from the command line)
установлю нужное мне значение ToolsVersion, то переменная MSBuildToolsPath примет значение, соответствующее этой версии ToolsVersion.
Но зачем всё это было нужно? Почему было сразу не использовать непосредственно переменную ToolsVersion в составе пути?
вот так примерно:
%ProgramFiles%\MSBuild\$(ToolsVersion)\bin
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Чем MSBuildToolsPath отличается от MSBuildBinPath ?
... ЭФ>Я могу предположить, что если я через параметр командной строки msbuild ЭФ>(by using the /ToolsVersion switch (or /tv, for short) when you build the project or solution from the command line) ЭФ>установлю нужное мне значение ToolsVersion, то переменная MSBuildToolsPath примет значение, соответствующее этой версии ToolsVersion.
Так и есть
ЭФ>Но зачем всё это было нужно? Почему было сразу не использовать непосредственно переменную ToolsVersion в составе пути? ЭФ>вот так примерно: ЭФ>%ProgramFiles%\MSBuild\$(ToolsVersion)\bin
Во-первых, потому, что не факт, что этот путь всегда будет именно в таком виде. Раньше, например, было в C:\Windows\Microsoft.Net\Framework, в будущем тоже может поменяться.
Это хорошая практика разделять версию и путь.
Во-вторых, потому, что ToolsPath можно переопределять, в этом случае жёстко указанный путь в ProgramFiles всё сломает.
Суть моей проблемы такова:
У меня есть .csproj-файл, внутри него есть директива Import, примерно такая:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
однако при сборке мне выдаётся ошибка:
error MSB4019: The imported project "xxx/Microsoft.CSharp.targets" was not found.
Confirm that the path in the declaration is correct, and that the file exists on disk.
и я вижу, что путь xxx не похож ни на что разумное.
Мне не ясно, что и где надо исправлять.
Другими словами, как вычисляется значение переменной MSBuildToolsPath по-умолчанию.
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Суть моей проблемы такова: ЭФ>У меня есть .csproj-файл, внутри него есть директива Import, примерно такая: ЭФ><Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> ЭФ>однако при сборке мне выдаётся ошибка: ЭФ>
error MSB4019: The imported project "xxx/Microsoft.CSharp.targets" was not found.
ЭФ>Confirm that the path in the declaration is correct, and that the file exists on disk.
ЭФ>и я вижу, что путь xxx не похож ни на что разумное.
А на что похож? Это может многое прояснить.
ЭФ>Мне не ясно, что и где надо исправлять.
ЭФ>Другими словами, как вычисляется значение переменной MSBuildToolsPath по-умолчанию.
По версии тулов в файле проекта или в параметрах запуска. Если там нет — то по версии, соответствующеё запускаемому msbuild.exe.
Для старых версий — где-то в C:\Windows\Microsoft.Net, для новых — в %ProgramFiles%, ещё от битности зависит.
Если у Вас на машине все установлено в пути по умолчанию и всё, что нужно, на самом деле присутствует, то, скорее всего, вы запускаете 64-битный msbuild.exe.
$ msbuild -toolsversion:Current ConsoleApp1.csproj
Microsoft (R) Build Engine version 15.9.20.62856 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
MSBUILD : error MSB1040: ToolsVersion is not valid. The tools version "Current" is unrecognized. Available tools versions are "2.0".
Switch: Current
$ msbuild -toolsversion:2.0 ConsoleApp1.csproj
...
error MSB4019: The imported project "/usr/lib64/mono/2.0/Microsoft.CSharp.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
Здравствуйте, Эйнсток Файр, Вы писали:
V>> А на что похож? Это может многое прояснить. ЭФ>я так не думаю...
ЭФ>
ЭФ>$ msbuild -toolsversion:2.0 ConsoleApp1.csproj
ЭФ>...
ЭФ>error MSB4019: The imported project "/usr/lib64/mono/2.0/Microsoft.CSharp.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
ЭФ>
Единственное, что я тут могу предположить, что Mono 2.0 у вас не установлено.