1

我正在尝试更新现有应用程序,以便它将从Visual Studio 2015(Enterprise)加载到Visual Studio 2017(Enterprise - V15.2(26430.12))中, AjaxMin构建任务的问题。Visual Studio 2017未从指定路径加载AjaxMin MSBuild任务

在Visual Studio 2015中,可以在C:\ Program Files(x86)\ MSBuild \ Microsoft \ MicrosoftAjax中找到AjaxMin构建任务。 Visual Studio 2017在C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ Microsoft中查找它。鉴于团队中的所有开发人员可能都没有VS2017 Enterprise,而且过去我们遇到了安装错误版本的开发人员的问题,所以我想让它使用解决方案中引用的AjaxMin NuGet软件包。

解决方案中有3个项目使用AjaxMin任务。我已经更新了他们都具有以下导入:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0"> 
... 
<Import Project="$(MSBuildProjectDirectory)\..\..\..\packages\AjaxMin.5.14.5506.26202\tools\net40\AjaxMin.targets" /> 
<Target Name="BeforeBuild"> 
    <ItemGroup> 
    <JS Include="..." Exclude="..." /> 
    </ItemGroup> 
    <ItemGroup> 
    <CSS Include="..." Exclude="..." /> 
    </ItemGroup> 
    <AjaxMin Switches="..." JsSourceFiles="@(JS)" JsCombinedFileName="..." CssSourceFiles="@(CSS)" CssCombinedFileName="..." /> 
</Target> 
... 
</Project> 

然而,当构建发生时,我收到一个错误说,它不能找到默认的内部扩展目录的AjaxMin任务:

无法从程序集C:\ Program 文件(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ Microsoft \ MicrosoftAjax \ AjaxMinTask.dll中加载“AjaxMin”任务。 无法加载文件或程序集'file:/// C:\ Program Files (x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ Microsoft \ MicrosoftAjax \ AjaxMinTask.dll' 或其某个依赖项。该系统找不到指定的文件。 确认声明是正确的,程序集 及其所有依赖关系都可用,并且任务包含实现Microsoft.Build.Framework.ITask的公共类。

我已经使用MSBuild Message Task输出路径,并通过从命令提示符导航到路径来验证它是否正确。我也尝试使用UsingTask,但没有运气。

为什么Visual Studio不在我指定的位置查找AjaxMin DLL?

更新: 我将AjaxMin的导入标签移到顶端(在项目标签下),它现在可以工作。我不明白为什么。

回答

0

问题变成另一个导入另一个第三方生成任务。看起来,构建任务会改变构建过程,使得AjaxMin构建任务在其后无法工作。在Microsoft.CSharp.Targets导入之后但在其他第三方构建任务之前完成AjaxMin构建任务的确有用。

0

我将AjaxMin的导入标记移动到顶部(正好在项目标记下)并且它现在可以工作。我不明白为什么。

如果我正确理解你的问题,那是因为你拥有了AjaxMinTask.dll两个参考源,一个是默认汇编源:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\MicrosoftAjax,另一个是进口参考,你会发现,AjaxMinTask.dll在使用AjaxMin.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMin" /> 
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinBundleTask" /> 
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestTask" /> 
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestCleanTask" /> 

... 
</Project> 

所以设置你的任务背后的进口参考时,的MSBuild将使用默认组件源(VS2017安装目录下),当您在任务前设置的进口参考,AjaxMin.targets将改写路径的参考来源。

+0

在非工作项目文件和工作项目文件中,目标文件的导入都发生在任务之前。 工作与非工作项目文件之间唯一的其他导入是在工作项目文件中,'AjaxMin'导入发生在'Microsoft.CSharp.Targets'之前。也许这可能是相关的?在工作和非工作导入位置之间的项目文件中唯一的其他东西是您的标准'PropertyGroup's和'ItemGroups' –

+0

我在C:\ Program Files(x86)中的Microsoft.CSharp.Targets之间做了一个差异, \ MSBuild \ 14.0 \ Bin \与C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin。唯一的区别是与跨目标有关(我没有这样做)。这就是说,'Microsoft.CSharp.Targets'文件导入了很多其他文件,这可能是原因。 –

相关问题