0

私は次のことをしようとしています:

  1. グループをフィルタリングします。
  2. ファイル名を文字列に出力します。
  3. 文字列をプロパティに保存します。
  4. タスクを呼び出すときに、このプロパティを使用しExecます。

私は立ち往生しています:

<CreateProperty Value="@(Files, ';')">
  <Output TaskParameter="Value" ItemName="TSFiles" />
</CreateProperty>
<Message Text="$(TSFiles)"/>

空文字列を出力します。


これが今のところ私がやったことです...しかし、これは私が泣きそうになりました

<Target Inputs="@(DeployLabel)" Name="GenericDeploy" Outputs="%(Identity).Dummy">
    <PropertyGroup>
      <TargetFilter>%(DeployLabel.Dir)</TargetFilter>
      <TargetFilterReplaced>$(TargetFilter.Replace('\', ''))</TargetFilterReplaced>
    </PropertyGroup>
    <WriteLinesToFile
        File="$(ProjectDir)tsfiles.txt"
        Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(%(Filter),
                   '$(TargetFilterReplaced)'))"
        Lines="@(TypeScriptCompile -&gt;'&quot;%(fullpath)&quot;', ' ')"
        Overwrite="false" />
    <PropertyGroup>
      <TSFilesFiltered>$([System.IO.File]::ReadAllText($(ProjectDir)tsfiles.txt))</TSFilesFiltered>
      <TSFilesOneLine>$([System.Text.RegularExpressions.Regex]::Replace(
      $(TSFilesFiltered), "[\n\r]+", " "))</TSFilesOneLine>
    </PropertyGroup>
    <Exec Command="tsc --target ES3 -c -d --out $(Deployroot)\foo.js $(TSFilesOneLine)" />
    <Delete Files="$(ProjectDir)tsfiles.txt"/>
  </Target>
4

1 に答える 1

0
<PropertyGroup>
 <TSFiles>@(Files)</TSFiles>
</PropertyGroup>
<Message Text="$(TSFiles)"/>

あるいは単に

<Message Text="@(Files)"/>

更新: DeployLabel の各要素ごとに個別にターゲットを呼び出すため、テキストをファイルに書き込んでこのファイルを直接読み取る理由がわかりません。したがって、tsfiles.txt には現在の要素の行のみを含める必要があります。

ここで test.proj を実行しましたが、特に@(TypeScriptCompileプロパティが空だったため、いくつかの問題がありました。そこで、この構造のダミー ファイルをいくつか作成しました。

d:\Temp\LabelTest\Label1.txt
d:\Temp\LabelTest2\Label2.txt
d:\Temp\LabelTest\Label2.txt

条件を検証するために 2 つの Label2.txt を作成したところ、別の順序にする必要があることがわかりました。あなたはそれを実行することができ、うまくいけばいくつかの新しいアイデアを得ることができます. テストに使用したprojファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="GenericDeploy" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">

<PropertyGroup>
 <Deployroot>d:\Temp</Deployroot>
</PropertyGroup>

<ItemGroup>
 <DeployLabel Include="$(Deployroot)\**\Label1.txt">
  <Filter>TempLabelTest</Filter>
 </DeployLabel>
 <DeployLabel Include="$(Deployroot)\**\Label2.txt">
  <Filter>TempLabelTest2</Filter>
 </DeployLabel>
</ItemGroup>

<Target Name="MessageLabels">
 <Message Text="@(DeployLabel)" />
</Target>

<Target Inputs="@(DeployLabel)" Name="GenericDeploy" Outputs="%(Identity).Dummy" DependsOnTargets="MessageLabels">
  <Message Text="DeployLabel.Filter: %(DeployLabel.Filter)" />
  <PropertyGroup>
   <TargetFilter>%(DeployLabel.Directory)</TargetFilter>
   <TargetFilterReplaced>$(TargetFilter.Replace('\', ''))</TargetFilterReplaced>
   <ConditionTest>$([System.Text.RegularExpressions.Regex]::IsMatch('$(TargetFilterReplaced)', '%(DeployLabel.Filter)'))</ConditionTest>
  </PropertyGroup>

  <Message Text="TargetFilter: $(TargetFilter)" />
  <Message Text="TargetFilterReplaced: $(TargetFilterReplaced)" />
  <Message Text="ConditionTest: $(ConditionTest)" />

  <PropertyGroup Condition="'$(ConditionTest)' == 'True'">
   <TSFilesFiltered>(TypeScriptCompile -&gt;'&quot;%(DeployLabel.fullpath)&quot;', ' ') </TSFilesFiltered>
   <TSFilesOneLine>$([System.Text.RegularExpressions.Regex]::Replace($(TSFilesFiltered), "[\n\r]+", " "))</TSFilesOneLine>
  </PropertyGroup>

  <Message Text="TSFilesFiltered: $(TSFilesFiltered)" />
  <Message Text="TSFilesOneLine: $(TSFilesOneLine)" /> 

  <Message Text="tsc --target ES3 -c -d --out $(Deployroot)\foo.js $(TSFilesOneLine)" Condition="'$(ConditionTest)' == 'True'"/>
 </Target>
</Project>
于 2013-07-05T11:24:09.110 に答える