4

我正在尝试更新现有应用程序,以便它将从 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 Files (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消息任务输出路径并通过从命令提示符导航到它来验证它是否正确。我也尝试使用UsingTask,但没有运气。

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

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

4

3 回答 3

3

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

于 2018-09-29T08:47:29.113 回答
1

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

于 2017-06-09T19:11:19.017 回答
0

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

如果我正确理解您的问题,那是因为您有两个参考源AjaxMinTask.dll,一个是默认的程序集源:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\MicrosoftAjax,另一个是导入参考,您会注意到AjaxMinTask.dllAjaxMin.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会重写引用源的路径。

于 2017-06-05T05:29:13.657 回答