MSBuild 正则表达式值为空

MSBuild Regex Value is empty

我无法让我的正则表达式在 MSBuild 中工作(这是我真正需要它的地方)。

在 C# 中正常工作:

        var input = @"Es wird versucht, das Paket aus ""Amusoft.EventManagement.csproj"" zu erstellen.;Paketerstellung der Dateien aus ""D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release"".;""Amusoft.EventManagement.nuspec"" wird für Metadaten verwendet.;Das Paket ""D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg"" wurde erfolgreich erstellt.;Es wird versucht, das Symbolpaket für ""Amusoft.EventManagement.csproj"" zu erstellen.;Paketerstellung der Dateien aus ""D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release"".;""Amusoft.EventManagement.nuspec"" wird für Metadaten verwendet.;Das Paket ""D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg"" wurde erfolgreich erstellt.";
        var m = Regex.Match(input, "(?<=\")[^\"]+nupkg(?=\")");

returns D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg

这正是我想要的。但是我无法在 MSBuild 中return任何东西,这是我需要它的地方。

MSBuild 尝试让它工作:

<Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release'">
    <!-- Ensure Directory + Package project-->
    <MakeDir Directories="$(SolutionDir)build$(ProjectName)$(Configuration)\"/>
    <Exec ConsoleToMSBuild="true"  Command="nuget pack $(ProjectPath) -Symbols -Prop Configuration=Release -OutputDirectory $(SolutionDir)build$(ProjectName)$(Configuration)" >
        <Output TaskParameter="ConsoleOutput" ItemName="NugetPackOutput"/>
    </Exec>

    <!-- Prepare pushing process -->
    <Message Importance="High" Condition="!Exists('$(ProjectDir)nugetapikey.txt')" Text="nugetapikey.txt does not exist." />
    <ReadLinesFromFile Condition="Exists('$(ProjectDir)nugetapikey.txt')" File="$(ProjectDir)nugetapikey.txt">
        <Output TaskParameter="Lines" ItemName="NugetApiKey"/>
    </ReadLinesFromFile>
    <Message Importance="High" Condition="Exists('$(ProjectDir)nugetapikey.txt')" Text="NugetApiKey is '@(NugetApiKey)'" />
    <PropertyGroup>
        <NugetPackageFileName2>$([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), `(?&lt;=&quot;)[^&quot;]+nupkg(?=&quot;)`))</NugetPackageFileName2>
        <NugetPackageFileName>$([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), `(?&lt;=")[^"]+.nupkg(?=")`))</NugetPackageFileName>
        <NugetPushCommand>nuget push PICKNAMEINEXPLORER $(NugetPackageFileName) -ApiKey @(NugetApiKey) -Timeout 60 -Verbosity normal</NugetPushCommand>
    </PropertyGroup>
    <Message Importance="High" Text="Pushcommand is $(NugetPushCommand)" />
    <Message Importance="High" Text="Pack Output is @(NugetPackOutput)" />
    <Message Importance="High" Text="NugetPackageFileName is $(NugetPackageFileName)" />
    <Message Importance="High" Text="NugetPackageFileName2 is $(NugetPackageFileName2)" />
    <Message Importance="High" Text="Regex1 is $([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), '.+'))" />
    <Message Importance="High" Text="Regex2 is $([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), `.+`))" />
    <Message Importance="High" Text="Regex3 is $([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), '(?&lt;=&quot;)[^&quot;]+nupkg(?=&quot;)'))" />
    <WriteLinesToFile Condition="Exists('$(ProjectDir)nugetapikey.txt')" File="$(SolutionDir)build$(ProjectName)$(Configuration)\pushcommand.txt" Lines="$(NugetPushCommand)" Overwrite="true"  Encoding="Unicode"/>
    <Exec ConsoleToMSBuild="true" ContinueOnError="true" IgnoreExitCode="true" Command="explorer.exe $(SolutionDir)build$(ProjectName)$(Configuration)" />
  </Target>

结果:

NugetPackageFileName is 1> NugetPackageFileName2 is 1> Regex1 is Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfolgreich erstellt.;Es wird versucht, das Symbolpaket für "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg" wurde erfolgreich erstellt. 1> Regex2 is Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfolgreich erstellt.;Es wird versucht, das Symbolpaket für "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg" wurde erfolgreich erstellt. 1> Regex3 is 1> Regex3 is

.+ 和 '.+' 试图验证内联正则表达式是否有效 - 事实就是如此。但是,任何通过正则表达式获取值的实际尝试都会失败。

基本上我想在这里做的是有一个构建脚本(当我完成后)将打开一个控制台window,其中包含一个预填充命令以将包推送到 nuget,而不会删除我的 apikey在来源 control/csproj 中。除了获得我的 Regex 值之外,其余的已经在以前的版本中工作了。

问题:

有谁知道我在 Regex 的 MSBuild 版本中做错了什么?

这里的问题不在于正则表达式。 Match 期望 String 并且它适用于 Properties,但不适用于 Items.

您需要更改 Exec 的输出类型(见下文),然后参考 $(NugetPackOutput) 而不是 @(NugetPackOutput)

之前

<Output TaskParameter="ConsoleOutput" ItemName="NugetPackOutput"/>

之后

<Output TaskParameter="ConsoleOutput" PropertyName="NugetPackOutput"/>

这是一个证明这一点的测试。注意在 MatchItem2 的情况下,正则表达式实际上匹配 ItemName 而不是输出。

test.bat

@ECHO off
ECHO Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfolgreich erstellt.;Es wird versucht, das Symbolpaket für "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg" wurde erfolgreich erstellt.

BuildApp.csproj

<Target Name="Test">
  <Exec ConsoleToMSBuild="true" Command="test.bat">
    <Output TaskParameter="ConsoleOutput" ItemName="OutputItem" />
    <Output TaskParameter="ConsoleOutput" PropertyName="OutputProperty" />
  </Exec>
  <Message Text="OutputItem: @(OutputItem)" />
  <Message Text="---" />
  <Message Text="OutputProperty: $(OutputProperty)" />
  <Message Text="---" />
  <Message Text="MatchItem1: $([System.Text.RegularExpressions.Regex]::Match(@(OutputItem), '.+'))" />
  <Message Text="---" />
  <Message Text="MatchItem2: $([System.Text.RegularExpressions.Regex]::Match(@(OutputItem), '.{5}'))" />
  <Message Text="---" />
  <Message Text="MatchItem3: $([System.Text.RegularExpressions.Regex]::Match(@(OutputItem), '(?&lt;=&quot;)[^&quot;]+nupkg(?=&quot;)'))" />
  <Message Text="---" />
  <Message Text="MatchProperty: $([System.Text.RegularExpressions.Regex]::Match($(OutputProperty), '(?&lt;=&quot;)[^&quot;]+nupkg(?=&quot;)'))" />
</Target>

测试输出

Test:
  test.bat
  Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj" zu erstellen
  .;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amu
  soft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird f?r
  Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\
  Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfolgreich erst
  ellt.;Es wird versucht, das Symbolpaket f?r "Amusoft.EventManagement.csproj"
  zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventMa
  nagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspe
  c" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManag
  ement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg" wu
  rde erfolgreich erstellt.
  OutputItem: Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj"
  zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventMa
  nagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspe
  c" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManag
  ement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfo
  lgreich erstellt.;Es wird versucht, das Symbolpaket f?r "Amusoft.EventManagem
  ent.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amu
  soft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventMana
  gement.nuspec" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusof
  t.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbo
  ls.nupkg" wurde erfolgreich erstellt.
  ---
  OutputProperty: Es wird versucht, das Paket aus "Amusoft.EventManagement.cspr
  oj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.Eve
  ntManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.n
  uspec" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventM
  anagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde
  erfolgreich erstellt.;Es wird versucht, das Symbolpaket f?r "Amusoft.EventMan
  agement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft
  \Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.Event
  Management.nuspec" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Am
  usoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.s
  ymbols.nupkg" wurde erfolgreich erstellt.
  ---
  MatchItem1: Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj"
  zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventMa
  nagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspe
  c" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManag
  ement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfo
  lgreich erstellt.;Es wird versucht, das Symbolpaket f?r "Amusoft.EventManagem
  ent.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amu
  soft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventMana
  gement.nuspec" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusof
  t.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbo
  ls.nupkg" wurde erfolgreich erstellt.
  ---
  MatchItem2: @(Out
  ---
  MatchItem3:
  ---
  MatchProperty: D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventMana
  gement\Release\WeakEvent.2.0.0.nupkg