2

私は以下を持っています

<RegexMatch Input="$(Configuration)" Expression="^.*?(?=\.)">
   <Output ItemName="Theme" TaskParameter="Output" />
</RegexMatch>

私の構成変数は次のとおりですTheme.Environment

したがって、「Default.Debug」または「Yellow.Release」

最初の部分をテーマと呼ばれる変数に入れたいと思います。私はこの正規表現をテストしました、そしてそれはスタンドアロンの正規表現テスターで動作します

^.*?(?=\.)

しかし、私のビルドファイルで使用された場合はそうではありません。

出力を確認できるように、変数をエコーアウトしています

<Exec Command="echo $(Theme)"/>
<Exec Command="echo $(Configuration)"/>

アイデア?

4

2 に答える 2

2

そのためにMSBuildコミュニティタスクを使用する必要がある場合は、次の行を確認してください。<Output PropertyName="Theme" TaskParameter="Output" />

PropertyName="Theme"後で参照したい場合に使用する必要があります$(Theme)ItemNameプロパティではなく、アイテムセットを作成します。

ただし、その具体的なタスクには、MsbuildコミュニティタスクよりもMSBuild4.0インライン関数を使用する方がはるかに簡単です。コードは次のようになります(スクリプトを採用します)。

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTarget="Play">
  <PropertyGroup>
    <Configuration>Yellow.Release</Configuration>
  </PropertyGroup>


  <Target Name="Play">

    <PropertyGroup>
      <Theme>$([System.Text.RegularExpressions.Regex]::Match($(Configuration), `^.*?(?=\.)`))</Theme>
    </PropertyGroup>

    <Message Text="$(Theme)" />
    <Message Text="$(Configuration)" />
  </Target>
</Project>
于 2012-10-21T17:39:04.803 に答える
0

RegexMatchは一致した文字列を返すのではなく、一致した場合は文字列全体を返すことに気づきました。

基本的にはMatchメソッドではなくIsMatchメソッドと呼ばれます

RegexReplaceとして書き直しました

<RegexReplace Input="$(Configuration)" Expression="\..*" Replacement="" Count="1">
    <Output ItemName="Theme" TaskParameter="Output" />
</RegexReplace>

その後、それはまだ機能していませんでした、そしてそれから私は私がやっていたことに気づきました

$(Theme)

になるはずだった

@(Theme)
于 2012-10-22T13:53:44.223 に答える