Visual studio 将消息输出捕获到属性中
我正在努力做到以下几点:Visual studio 将消息输出捕获到属性中,visual-studio,msbuild,Visual Studio,Msbuild,我正在努力做到以下几点: 筛选组 将文件名打印成字符串 将字符串保存到属性中 调用Exec任务时使用此属性 我被困在: <CreateProperty Value="@(Files, ';')"> <Output TaskParameter="Value" ItemName="TSFiles" /> </CreateProperty> <Message Text="$(TSFiles)"/> 打印空字符串 这就是我现在要做的。。。但这几
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 ->'"%(fullpath)"', ' ')"
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>
%(DeployLabel.Dir)
$(TargetFilter.Replace('\','')
$([System.IO.File]::ReadAllText($(ProjectDir)tsfiles.txt))
$([System.Text.RegularExpressions.Regex]::替换(
$(TSFilesFiltered),“[\n\r]+”,“”)
我制作了两个Label2.txt来验证条件,并发现它需要以其他顺序。你可以运行它,并希望得到一些新的想法,或者你可以命名什么需要不同。以下是我用于测试的项目文件:
<?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 ->'"%(DeployLabel.fullpath)"', ' ') </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>
d:\Temp
模板测试
TemplateLabelTest2
%(DeployLabel.Directory)
$(TargetFilter.Replace('\','')
$([System.Text.RegularExpressions.Regex]::IsMatch(“$(TargetFilterReplace)”,”%(DeployLabel.Filter)”)
(TypeScriptCompile-“%”(DeployLabel.fullpath)”,“”)
$([System.Text.RegularExpressions.Regex]::替换($(TSFilesFiltered),“[\n\r]+”,“”)
问题在于,我在消息
中有一个条件
,它以一种特殊的方式过滤文本。我以后需要在另一个目标中重复使用筛选结果,所以这就是为什么您的建议都没有帮助,不幸的是:(您可以发布一个示例,说明您的特殊筛选条件以及在另一个目标中使用该结果吗?是的,我可以…但它很难看:(好的,我会在几分钟内更新帖子。我会在几分钟内测试这一点,但为了解释为什么我需要写入文件:如果我在Exec
任务中加入一个条件,那么它会运行多次,将需要操作的文件分成随机大小的组。这将导致它用任意大小的命令多次覆盖目标JS文件将这些行写入文件并读回是我能找到的将它们放在单个变量中的唯一方法(而不是在任务本身中过滤它们)。另外,马上:您在ConditionTest
中所做的并不是我想做的。需要使用附加到每个特定文件的元数据对文件进行筛选。按照您的方式,将是“全部或无”,而不是筛选。
<Message Text="@(Files)"/>
d:\Temp\LabelTest\Label1.txt
d:\Temp\LabelTest2\Label2.txt
d:\Temp\LabelTest\Label2.txt
<?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 ->'"%(DeployLabel.fullpath)"', ' ') </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>