0

我正在尝试在我的 MSBuild 文件中编写一个自定义任务,以使用 Google Closure Compiler 压缩一些 js 文件。我从该站点下载了 ClosureCompiler.dll 和 ClosureCompiler.tasks 文件,并将它们保存在我的 m/c 上的一个文件夹中。我在我的 csproj 文件中添加了以下行

<Import Project="C:\Projects\Closure\ClosureCompiler.tasks" />
<Target Name="AfterBuild">
    <ItemGroup>
        <JS Include="test.js" />
    </ItemGroup>
    <ClosureCompiler CompilationLevel="SIMPLE_OPTIMIZATIONS" SourceFiles="@(JS)" SourceExtensionPattern="\.js$" TargetExtension=".min.js" />
</Target>

test.js 文件保存在我的项目文件的根目录中。我不想包含可选的 ApiUrl,因为我想使用 ClosureCompiler.dll 在本地压缩文件。ClosureCompiler.tasks 文件是

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="ClosureCompiler" AssemblyFile="C:\Projects\Closure\ClosureCompiler.dll" /> 
</Project>

但是,当我尝试编译项目时,它给了我一个错误:

Compilation Failed: test.js, Reason: Object reference not set to instance of an object

任何人都可以帮助解决问题或我做错了什么吗?

4

2 回答 2

1

http://closure-compiler.appspot.com/home

看看你能不能把“任何东西”粘贴进去。你可能已经达到了每小时的限制。如果上述情况发生并导致错误,VS2010 将抛出此消息。所以......这是一件会导致它的事情。

于 2011-04-10T15:51:47.857 回答
1

我遇到了同样的问题,这是自定义任务代码中的一个错误。这是因为 API 返回错误,而自定义代码未检查 API 是否返回错误。

它会检查

compiledSource.SelectSingleNode("//compileCode").InnerText

如果没有名为compiledCode的节点,这将抛出一个不引用.InnerText的对象。您需要首先检查响应中的错误。

if (compiledSource.SelectSingleNode("//error") != null)
    throw new Exception(compiledSource.SelectSingleNode("//error").InnerText);
于 2011-04-06T22:35:50.590 回答