Variabile di condizione definita dall'utente per i riferimenti ai pacchetti in C # .NET Core?
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
Ok prova questo,
Ho creato un semplice console app
e class library
, e usato dotnet
build
da 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
.
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.