MsBuild начинается с оценки не в состоянии? - PullRequest
0 голосов
/ 09 марта 2020

Пытаясь настроить некоторые инструменты покрытия кода и работать над новым проектом Xamarin.Forms через VisualStudio на Ma c, я пытаюсь использовать netfx.props, как предложено в mac / linux ` do tnet build` Ссылочные сборки для фреймворка ".NETFramework .." не найдены . (Я бы прокомментировал этот вопрос напрямую, но, увы, у меня недостаточно очков репутации.)

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) Microsoft Corporation.  All Rights Reserved.  See License.txt in the project root for license information. -->
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!-- When compiling .NET SDK 2.0 projects targeting .NET 4.x on Mono using 'dotnet build' you -->
    <!-- have to teach MSBuild where the Mono copy of the reference asssemblies is -->
    <TargetIsMono Condition="($(TargetFramework.StartsWith('net4')) OR $(TargetFrameworkVersion.StartsWith('v4.'))) AND '$(OS)' == 'Unix'">true</TargetIsMono>

    <!-- Look in the standard install locations -->
    <BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/Library/Frameworks/Mono.framework/Versions/Current/lib/mono')">/Library/Frameworks/Mono.framework/Versions/Current/lib/mono</BaseFrameworkPathOverrideForMono>
    <BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/usr/lib/mono')">/usr/lib/mono</BaseFrameworkPathOverrideForMono>
    <BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/usr/local/lib/mono')">/usr/local/lib/mono</BaseFrameworkPathOverrideForMono>

    <!-- If we found Mono reference assemblies, then use them -->
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net45' OR '$(TargetFrameworkVersion)' == 'v4.5')">$(BaseFrameworkPathOverrideForMono)/4.5-api</FrameworkPathOverride>
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net451' OR '$(TargetFrameworkVersion)' == 'v4.5.1')">$(BaseFrameworkPathOverrideForMono)/4.5.1-api</FrameworkPathOverride>
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net452' OR '$(TargetFrameworkVersion)' == 'v4.5.2')">$(BaseFrameworkPathOverrideForMono)/4.5.2-api</FrameworkPathOverride>
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net46' OR '$(TargetFrameworkVersion)' == 'v4.6')">$(BaseFrameworkPathOverrideForMono)/4.6-api</FrameworkPathOverride>
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net461' OR '$(TargetFrameworkVersion)' == 'v4.6.1')">$(BaseFrameworkPathOverrideForMono)/4.6.1-api</FrameworkPathOverride>
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net462' OR '$(TargetFrameworkVersion)' == 'v4.6.2')">$(BaseFrameworkPathOverrideForMono)/4.6.2-api</FrameworkPathOverride>
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net47' OR '$(TargetFrameworkVersion)' == 'v4.7')">$(BaseFrameworkPathOverrideForMono)/4.7-api</FrameworkPathOverride>
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net471' OR '$(TargetFrameworkVersion)' == 'v4.7.1')">$(BaseFrameworkPathOverrideForMono)/4.7.1-api</FrameworkPathOverride>
    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net472' OR '$(TargetFrameworkVersion)' == 'v4.7.2')">$(BaseFrameworkPathOverrideForMono)/4.7.2-api</FrameworkPathOverride>
    <EnableFrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">true</EnableFrameworkPathOverride>

    <!-- Add the Facades directory.  Not sure how else to do this. Necessary at least for .NET 4.5 -->
    <AssemblySearchPaths Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">$(FrameworkPathOverride)/Facades;$(AssemblySearchPaths)</AssemblySearchPaths>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)'== 'net472' OR '$(TargetFrameworkVersion)' == 'v4.7.2'">
    <Reference Include="netstandard" />
  </ItemGroup>
</Project>

Файл импортирован с помощью штрафа .csproj, но он все еще не работает, поэтому я распечатал некоторые сообщения отладки, используя:

    <Target Name="test">
        <Message Importance="High" Text="TargetFramework value is '$(TargetFramework)', starts with net4 is '$(TargetFramework.StartsWith('net4'))'" />
        <Message Importance="High" Text="TargetFrameworkVersion value is '$(TargetFrameworkVersion)', starts with v4 is '$(TargetFrameworkVersion.StartsWith('v4'))'" />
        <Message Importance="High" Text="OS value is '$(OS)'" />
        <Message Importance="High" Text="TargetIsMono value is '$(TargetIsMono)'" />
        <Message Importance="High" Text="BaseFrameworkPathOverrideForMono value is '$(BaseFrameworkPathOverrideForMono)'" />
        <Message Importance="High" Text="FrameworkPathOverride value is '$(FrameworkPathOverride)'" />
        <Message Importance="High" Text="EnableFrameworkPathOverride value is '$(EnableFrameworkPathOverride)'" />
    </Target>

и увидел, что:

  TargetFramework value is '', starts with net4 is 'False'
  TargetFrameworkVersion value is 'v4.7', starts with v4 is 'True'
  OS value is 'Unix'
  TargetIsMono value is ''
  BaseFrameworkPathOverrideForMono value is ''
  FrameworkPathOverride value is '/Library/Frameworks/Mono.framework/Versions/6.6.0/lib/mono/4.7-api'
  EnableFrameworkPathOverride value is ''

TargetIsMono остается пустым, даже если для него должно было быть установлено значение "true" из-за TargetFrameworkVersion.StartsWith и OS. После игры с TargetIsMono Condition проблема, похоже, заключается в том, что, хотя StartsWith имеют правильные логические значения в соответствии с сообщениями печати, они на самом деле не оцениваются должным образом в Condition.

Т.е.,

    <TargetIsMono Condition="$(TargetFrameworkVersion.StartsWith('v4.'))>true</TargetIsMono>

не устанавливает TargetIsMono в значение «истина», хотя и должно.

У кого-нибудь есть идеи? Я новичок в MsBuild, Xamarin.Forms и VisualStudio. Буду признателен за любую помощь!

ОБНОВЛЕНИЕ / РЕШЕНИЕ

Я переключил целевую версию фреймворка на 4.8, затем обратно на 4.7, и это решило само. _ (ツ) _ / ¯

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...