Variabile di condizione definita dall'utente per i riferimenti ai pacchetti in C # .NET Core?

Aug 23 2020

Ho un riferimento al progetto nel mio csproj qualcosa di simile al seguente:

 <ItemGroup>
   <ProjectReference Include="..\..\test\PressurePointLib\PressurePointLib.csproj" />   
  </ItemGroup>

È una libreria (DLL) che deve essere inclusa solo nell'ambiente di test e non voglio che sia collegata al progetto corrente in produzione.

Voglio che questo riferimento venga incluso in modo condizionale in base alla variabile di condizione.

Capisco di poter utilizzare i riferimenti alle condizioni come descritto qui, ma mi chiedevo se posso definire la mia variabile (ad esempio PressurePointsEnabled) e, in caso affermativo, come faccio a impostare quella variabile di build nella riga di comando e in Visual Studio?

AGGIORNAMENTO Ho provato quanto segue e sembra che abbia funzionato.

 <ItemGroup Label="MyProject" Condition="'$(PressurePointsEnabled)'=='true'">
    <ProjectReference Include="..\..\test\PressurePointLib\BlackLine.Test.PressurePointLib.csproj" />
  </ItemGroup>

e quando costruisco

dotnet build -p:PressurePointsEnabled=true

In che modo @Berkay è diverso dalla tua soluzione qui sotto, sembra più complesso?

Risposte

1 Berkay Aug 23 2020 at 17:29

Ok prova questo,

Ho creato un semplice console appe class library, e usato dotnet buildda powershell.

Ecco il file csproj,

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    </ItemGroup>

    <ItemGroup Condition=" $(PressurePointsEnabled.Contains('PROD')) "> <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" /> </ItemGroup> <Target Name="Test" AfterTargets="Build"> <Message Text="Project $(ProjectName) Test PostBuild" Importance="high" />
        <Message Text="SUCCESS!" Condition=" $(PressurePointsEnabled.Contains('PROD')) " Importance="high" />
    </Target>
</Project>

E come hai detto che ho usato PressurePointsEnabled. Dopodiché eseguo questo comando su powershell. Ho bisogno di vedere SUCCESSO! se la condizione è PROD altrimenti il ​​messaggio dell'evento post build non verrà visualizzato.

Ecco il comando;

dotnet build -p:PressurePointsEnabled="UAT" C:\Users\Berkay\source\repos\ConsoleApp4

Il risultato:

E se cambio UAT in PROD, l'output sarà:

dotnet build -p:PressurePointsEnabled="UAT" C:\Users\Berkay\source\repos\ConsoleApp4

Quindi sì. Puoi definire la tua costante e impostarne il valore e controllare da csproj.

1 SaherAhwal Aug 28 2020 at 06:26

Ecco la mia soluzione finale nel caso qualcuno sia curioso:

  <PropertyGroup Condition="'$(PressurePointsEnabled)'=='true'"> <DefineConstants>PP_ENABLED</DefineConstants> </PropertyGroup> <ItemGroup Label="PPLib" Condition="$(DefineConstants.Contains('PP_ENABLED'))"> 
    <ProjectReference Include="..\..\test\PressurePointLib\MyService.Test.PressurePointLib.csproj" />
  </ItemGroup>

Puoi costruire con

dotnet build -p:PressurePointsEnabled=true

quando ciò è vero, viene definito PP_ENABLED.

Nel codice puoi usare

#if PP_ENABLED

per definire il codice che dipende dalla libreria inclusa. Saluti.