Visual Studio 2017 未从指定路径加载 AjaxMin MSBuild 任务
Visual Studio 2017 not loading AjaxMin MSBuild Task from specified path
我正在尝试更新现有应用程序,以便它可以从 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 Studio17\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 任务:
The "AjaxMin" task could not be loaded from the assembly C:\Program
Files (x86)\Microsoft Visual
Studio17\Enterprise\MSBuild\Microsoft\MicrosoftAjax\AjaxMinTask.dll.
Could not load file or assembly 'file:///C:\Program Files
(x86)\Microsoft Visual
Studio17\Enterprise\MSBuild\Microsoft\MicrosoftAjax\AjaxMinTask.dll'
or one of its dependencies. The system cannot find the file specified.
Confirm that the 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.
我用过 MSBuild Message Task to output the path and verified that it is correct by navigating to it from the command prompt. I also tried using the UsingTask,但运气不好。
为什么 Visual Studio 不在我指定的位置寻找 AjaxMin DLL?
更新:
我将 AjaxMin 的导入标签移到了顶部(就在项目标签下面),它现在可以工作了。我不明白为什么。
I moved the import tag for AjaxMin to the top (right under the project tag) and it works now. I don't understand why.
如果我没理解错你的问题,那是因为你有两个参考源AjaxMinTask.dll
,一个是默认的汇编源:C:\Program Files (x86)\Microsoft Visual Studio17\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
导入之后但在其他第三方构建任务之前执行 AjaxMin
构建任务。
我通过安装 .Net 3.5 框架解决了这个问题
我正在尝试更新现有应用程序,以便它可以从 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 Studio17\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 任务:
The "AjaxMin" task could not be loaded from the assembly C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\MSBuild\Microsoft\MicrosoftAjax\AjaxMinTask.dll. Could not load file or assembly 'file:///C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\MSBuild\Microsoft\MicrosoftAjax\AjaxMinTask.dll' or one of its dependencies. The system cannot find the file specified. Confirm that the 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.
我用过 MSBuild Message Task to output the path and verified that it is correct by navigating to it from the command prompt. I also tried using the UsingTask,但运气不好。
为什么 Visual Studio 不在我指定的位置寻找 AjaxMin DLL?
更新: 我将 AjaxMin 的导入标签移到了顶部(就在项目标签下面),它现在可以工作了。我不明白为什么。
I moved the import tag for AjaxMin to the top (right under the project tag) and it works now. I don't understand why.
如果我没理解错你的问题,那是因为你有两个参考源AjaxMinTask.dll
,一个是默认的汇编源:C:\Program Files (x86)\Microsoft Visual Studio17\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
导入之后但在其他第三方构建任务之前执行 AjaxMin
构建任务。
我通过安装 .Net 3.5 框架解决了这个问题