【问题标题】:Visual Studio 2017 not loading AjaxMin MSBuild Task from specified pathVisual Studio 2017 未从指定路径加载 AjaxMin MSBuild 任务
【发布时间】:2017-11-04 00:54:39
【问题描述】:

我正在尝试更新现有应用程序,以便它可以从 Visual Studio 2015 (Enterprise) 加载到 Visual Studio 2017 (Enterprise - V15.2 (26430.12)) 中,但 AjaxMin 构建任务存在问题。

在 Visual Studio 2015 中,AjaxMin 构建任务位于 C:\Program Files (x86)\MSBuild\Microsoft\MicrosoftAjax 中。 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 加载“AjaxMin”任务 文件 (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\MicrosoftAjax\AjaxMinTask.dll。 无法加载文件或程序集 'file:///C:\Program Files (x86)\微软视觉 Studio\2017\Enterprise\MSBuild\Microsoft\MicrosoftAjax\AjaxMinTask.dll' 或其依赖项之一。该系统找不到指定的文件。 确认声明正确,即组装 并且它的所有依赖项都是可用的,并且该任务包含一个 实现 Microsoft.Build.Framework.ITask 的公共类。

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

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

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

【问题讨论】:

    标签: visual-studio msbuild visual-studio-2017 microsoft-ajax-minifier


    【解决方案1】:

    我通过安装 .Net 3.5 框架解决了这个问题

    【讨论】:

      【解决方案2】:

      问题原来是另一个第三方构建任务的另一个导入。似乎构建任务改变了构建过程,使得AjaxMin 构建任务在它之后将无法工作。在 Microsoft.CSharp.Targets 导入之后但在其他第三方构建任务之前拥有 AjaxMin 构建任务就可以了。

      【讨论】:

        【解决方案3】:

        我将 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会重写引用源的路径。

        【讨论】:

        • 在非工作项目文件和工作项目文件中,目标文件的导入发生在任务之前。在工作项目文件和非工作项目文件之间更改的唯一其他导入是在工作项目文件中,AjaxMin 导入发生在 Microsoft.CSharp.Targets 之前。也许这可能是相关的?项目文件中工作和非工作导入位置之间的唯一其他内容是您的标准 PropertyGroups 和 ItemGroups
        • 我在 C:\Program Files (x86)\MSBuild\14.0\Bin\ 与 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise 中的 Microsoft.CSharp.Targets 之间进行了比较\MSBuild\15.0\Bin。唯一的区别与交叉定位有关(我没有这样做)。也就是说,Microsoft.CSharp.Targets 文件导入了许多其他文件,这可能是原因...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 2017-05-19
        相关资源
        最近更新 更多