2017-07-24 94 views
1

因为我需要它的功能,所以我分出了一个NuGet包,它应该能够让我在我的构建中处理正则表达式,其目标是将.NET Framework版本号转换为环境变量,例如,4.7变为NET47。我非常熟悉正则表达式以实现这一点,并且当我从控制台程序调用程序集时,该任务可以完美运行。它查找并加载程序集,运行其Execute方法并设置期望的属性值。但是,当我尝试在构建中运行任务时,MSBuild报告如下。无法从程序集中加载“RegularExpressionMatching”任务RegexMatch.MSBuildTask

的 “RegularExpressionMatching” 任务无法从组件řegexMatch.MSBuildTask,版本= 1.0.0.7,文化=中性公钥= 659f28f508fc4cd9,ProcessorArchitecture用于= MSIL被加载。确认声明是正确的,程序集及其所有依赖项都可用,并且任务包含一个实现Microsoft.Build.Framework.ITask的公共类。 C:\ Users \ DAVE \ Documents \ Visual Studio 2013 \ Projects \ WizardWrx_Libs \ DLLServices2 \ ConsoleStreamsLab \ ConsoleStreamsLab_4.7 \ ConsoleStreamsLab_4.7.csproj 81 5 ConsoleStreamsLab_4.7

My UsingTask元素如下。

<UsingTask TaskName="RegularExpressionMatching" 
      AssemblyName="RegexMatch.MSBuildTask, Version=1.0.0.7, Culture=neutral, PublicKeyToken=659f28f508fc4cd9, processorArchitecture=MSIL" /> 

我的目标块如下。

<Target Name="SecondMatch" AfterTargets="BeforeBuild"> 
    <Message Text="TargetFrameworkVersion = $(TargetFrameworkVersion)" Importance="high" /> 
    <Message Text="DefineConstants  = $(DefineConstants)" Importance="high" /> 
    <RegularExpressionMatching Input="$(DefineConstants)" Pattern="^(.*)(*;NET\d{1,2})(;*.*)*$" > 
     <Output TaskParameter="IsMatch" 
       PropertyName="IsMatchJiro" /> 
     <Output TaskParameter="Match" 
       PropertyName="MatchJiro" /> 
     <Output TaskParameter="Replacement" 
       PropertyName="ReplacementJiro" /> 
    </RegularExpressionMatching> 

前两条消息出现在构建日志中,与预期完全相同,并在下一个显示。

------ Build started: Project: ConsoleStreamsLab_4.7, Configuration: Debug Any CPU ------ 
Build started 2017/07/24 15:14:29. 
SecondMatch: 
    TargetFrameworkVersion = v4.7 
    DefineConstants  = DEBUG;TRACE 
C:\Users\DAVE\Documents\Visual Studio 2013\Projects\WizardWrx_Libs\DLLServices2\ConsoleStreamsLab\ConsoleStreamsLab_4.7\ConsoleStreamsLab_4.7.csproj(81,5): error MSB4062: The "RegularExpressionMatching" task could not be loaded from the assembly RegexMatch.MSBuildTask, Version=1.0.0.7, Culture=neutral, PublicKeyToken=659f28f508fc4cd9, processorArchitecture=MSIL. Confirm that the <UsingTask> declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask. 

Build FAILED. 

Time Elapsed 00:00:00.00 
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ========== 

Diagnostic Level Build Log是以前的尝试,将日志记录级别设置为诊断。尽管它提供了更多的信息,但据我所知,没有任何信息能够说明问题。

有问题的组件具有强名称,安装到GAC在其上构建运行在机器上,并没有任何不寻常的依赖,比三个的MSBuild组件等。

我怀疑的解决办法可能是在RegExMatch Solution列出的程序集引用,具体Microsoft.Build.Utilities.v4.0,因为我不知道该如何说与在Visual Studio 2013中运行构建引擎相关,它将自己报告为版本12(尽管这可能只涉及它发布的Visual Studio版本)。

我真的想让这个工作,以便我可以做这个任务的数据驱动的方式,并消除硬编码的设置。一旦我有了一个概念证明,我也会很高兴向原作者提交一个请求。

我会睁大眼睛看好的建议。

回答

0

您是否导入了扩展项目?我没用过,你用特定的扩展,但是当我用MSBuildExtensions我不得不一组线增加的影响:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" /> 

只有在这条线是目前是我能接取目标并使用扩展。

+0

这个改变对结果没有影响。审查文件的内容,我不可能看到它会如何改变任何事情。然而,之前发生过,我继续前进,结果与以前完全一样。 –

+0

因此,只是为了检查你是否将导入路径引用到了重建的nuget包中?因为不要逐字复制我的行,而是导入包含要使用的扩展的项目? – Spence

+0

什么?添加VS项目?这很愚蠢!由于其他用户无法访问我的源代码,因此该建议不可移植。我误解了你的意图吗?当然,我没有逐字复制你的专辑。我调整它以符合我的Visual Studio安装! –