Условные цели компиляции и структуры

Как и в других примерах, я использую подобный подход, но вместо того, чтобы тратить время на вычисление последней выходной длины и т. д.,

Я просто использую escape-коды ANSI для возврата к началу строки и затем очистите всю строку перед печатью моего текущего выхода.

import sys

class Printer():
    """Print things to stdout on one line dynamically"""
    def __init__(self,data):
        sys.stdout.write("\r\x1b[K"+data.__str__())
        sys.stdout.flush()

Чтобы использовать в своем цикле итерации, вы просто вызываете что-то вроде:

x = 1
for f in fileList:
    ProcessFile(f)
    output = "File number %d completed." % x
    Printer(output)
    x += 1   

. здесь

119
задан Peter Mortensen 10 September 2019 в 13:07
поделиться

2 ответа

Один из лучших способов добиться этого - создать различные конфигурации сборки в вашем проект:

<PropertyGroup Condition="  '$(Framework)' == 'NET20' ">
  <DefineConstants>NET20</DefineConstants>
  <OutputPath>bin\$(Configuration)\$(Framework)</OutputPath>
</PropertyGroup>


<PropertyGroup Condition="  '$(Framework)' == 'NET35' ">
  <DefineConstants>NET35</DefineConstants>
  <OutputPath>bin\$(Configuration)\$(Framework)</OutputPath>
</PropertyGroup>

И в одной из ваших конфигураций по умолчанию:

<Framework Condition=" '$(Framework)' == '' ">NET35</Framework>

Который установил бы значение по умолчанию, если бы он не был определен где-либо еще. В приведенном выше случае OutputPath будет предоставлять вам отдельную сборку при каждой сборке каждой версии.

Затем создайте цель AfterBuild для компиляции ваших различных версий:

<Target Name="AfterBuild">
  <MSBuild Condition=" '$(Framework)' != 'NET20'"
    Projects="$(MSBuildProjectFile)"
    Properties="Framework=NET20"
    RunEachTargetSeparately="true"  />
</Target>

В этом примере будет перекомпилирован весь проект с переменной Framework, установленной на NET20, после первой сборки (компилируем обе и предполагаем, что первая сборка была NET35 по умолчанию из приведенного выше ). Каждая компиляция будет иметь правильные значения условного определения.

Таким образом вы даже можете исключить определенные файлы из файла проекта, если хотите, чтобы файлы не определялись #ifdef:

<Compile Include="SomeNet20SpecificClass.cs" Condition=" '$(Framework)' == 'NET20' " />

или даже ссылки

<Reference Include="Some.Assembly" Condition="" '$(Framework)' == 'NET20' " >
  <HintPath>..\Lib\$(Framework)\Some.Assembly.dll</HintPath>
</Reference>
118
ответ дан 24 November 2019 в 01:32
поделиться

При использовании системы сборки.NET Core можно использовать ее предопределенные символы (которые на самом деле уже соответствуют примеру и не требуют никаких изменений в Вашем .csproj!):

#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif

список предопределенных символов документируется в [1 133] Библиотеки Разработки с Кросс-платформенными Инструментами и #if (Ссылка C#) :

Платформа.NET: NETFRAMEWORK, NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472, NET48

Стандарт.NET: NETSTANDARD, NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0, NETSTANDARD2_1

.NET Core: NETCOREAPP, NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2, NETCOREAPP3_0

0
ответ дан 24 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: