DefineConstants работает с командой Run, но не с командой Build - PullRequest
2 голосов
/ 21 июня 2020

Я изо всех сил пытаюсь понять разницу между командами dotnet run и dotnet build в отношении констант, определенных в файле .csproj

example.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)'=='Test'">
      <DefineConstants>$(DefineConstants);INCLUDE_TESTS</DefineConstants>
    </PropertyGroup>
</Project>

program.cs

using System;

namespace define_example
{
    class Program
    {
        static void Main(string[] args)
        {
#if INCLUDE_TESTS
            Console.WriteLine("It worked!");
#endif
            Console.WriteLine("Hello World!");
        }
    }
}

Если я бегу dotnet run -c Test, -> It worked! Hello World!

Если я бегу dotnet build -c Test, то dotnet run {buildpath} -> Hello World!

Почему определенная константа go отсутствует при запуске команды сборки?

1 Ответ

1 голос
/ 22 июня 2020

dotnet build и dotnet run - это обе команды, которые действуют в отношении файла csproj, а не DLL или исполняемого файла. dotnet build вызовет команду dotnet restore, а затем построит проект. dotnet run вызовет команду dotnet build (это важно отметить в связи с вашей проблемой), а затем запустит полученную dll или exe.

То, что вы сейчас говорите, сделайте tnet вызовы dotnet build -c Test и dotnet run:

  1. очистка, восстановление, сборка (с использованием конфигурации «Тест»)
  2. очистка, восстановление, сборка, запуск (без указания конфигурации )

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

Вы можете изменить dotnet run на dotnet run --no-build, чтобы он предполагал, что сборка уже завершена, и просто предполагать, что файлы, которые должны были быть созданы, присутствуют и верны.

В качестве альтернативы, учитывая что ваш проект имеет OutputType из Exe, вы можете просто вызвать исполняемый файл, который создается командой сборки обычным способом в качестве второго шага. то есть с помощью команды example.exe.

Если ваш OutputType не был указан или был задан по умолчанию (Library), тогда это приведет к созданию dll, а не exe, и вы можете запустить его с помощью dotnet команда: dotnet example.dll.

Полезное чтение по различным командам, а также общие свойства:

...