Странные вопросы про msbuild
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 13.03.19 13:20
Оценка:
Чем 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
Отредактировано 13.03.2019 13:37 Эйнсток Файр . Предыдущая версия . Еще …
Отредактировано 13.03.2019 13:36 Эйнсток Файр . Предыдущая версия .
Отредактировано 13.03.2019 13:35 Эйнсток Файр . Предыдущая версия .
Re: Странные вопросы про msbuild
От: vmpire Россия  
Дата: 13.03.19 13:54
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Чем 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 всё сломает.
Re[2]: Странные вопросы про msbuild
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 13.03.19 14:36
Оценка:
Суть моей проблемы такова:
У меня есть .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 по-умолчанию.
Отредактировано 13.03.2019 14:39 Эйнсток Файр . Предыдущая версия .
Re[3]: Странные вопросы про msbuild
От: vmpire Россия  
Дата: 13.03.19 14:43
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Суть моей проблемы такова:

ЭФ>У меня есть .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.
Re[4]: Странные вопросы про msbuild
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 14.03.19 15:53
Оценка:
V> скорее всего, вы запускаете 64-битный msbuild.exe.

А зачем тогда в файле констант две переменные:
https://github.com/Microsoft/msbuild/blob/master/src/Shared/Constants.cs#L20-L28 ?

/// <summary>
/// The name of the property that indicates the tools path
/// </summary>
internal const string ToolsPath = "MSBuildToolsPath";

/// <summary>
/// Name of the property that indicates the X64 tools path
/// </summary>
internal const string ToolsPath64 = "MSBuildToolsPath64";


MSBuildToolsPath64 — это незадокументированная переменная:
https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-reserved-and-well-known-properties?view=vs-2017
Re[4]: Странные вопросы про msbuild
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 14.03.19 18:07
Оценка:
V> А на что похож? Это может многое прояснить.

я так не думаю...

$ 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.
Отредактировано 14.03.2019 18:11 Эйнсток Файр . Предыдущая версия .
Re[5]: Странные вопросы про msbuild
От: vmpire Россия  
Дата: 15.03.19 08:08
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

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 у вас не установлено.
Re[6]: Странные вопросы про msbuild
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 15.03.19 09:01
Оценка:
V> Единственное, что я тут могу предположить, что Mono 2.0 у вас не установлено.

И не должно быть. После выхода mono 4.0 поддержку 2.0 прекратили:

We dropped support for the 2.0, 3.5 and 4.0 assemblies
...
Mono will now only build the .NET 4.5 assemblies

https://www.mono-project.com/docs/about-mono/releases/4.0.0/

$ mono -V
Mono JIT compiler version 5.12.0.226 (tarball Fri Jun 1 01:05:29 -00 2018)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: altstack
Notifications: epoll
Architecture: amd64
Disabled: none
Misc: softdebug
Interpreter: yes
LLVM: supported, not enabled.
GC: sgen (concurrent by default)

Отредактировано 15.03.2019 9:03 Эйнсток Файр . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.