2

有没有办法在构建过程中动态添加嵌入式资源?我目前正在使用 Ajax-Minifier 将两个文件缩减为一个。结果效果很好。但是,当代码在发布模式下运行时,我需要将此文件作为嵌入式资源包含在内(当前由 if(!DEBUG) 的预处理器指令切换

这是我在 MSBUILD 中使用的目标命令的简单版本

<Target Name="TestMinifiy" Condition=" '$(ConfigurationName)' == 'Release' ">
    <ItemGroup>
      <MyScript Include="..\Test1.js" />
      <MyScript Include="..\Test2.js" />
    </ItemGroup>
    <AjaxMin JsSourceFiles="@(MyScript)" JsCombinedFileName="$(IntermediateOutputPath)\Final.js" />
</Target>

所以基本上我想将 Final.js 作为嵌入式资源包含在内,然后我可以在代码中引用。

从 C# 方面来看,这就是我想要做的:

#if (!DEBUG)
[assembly: WebResource("Final.js", "text/javascript")]
#endif

任何帮助或想法将不胜感激。

编辑:

我已将 JsCombinedFileName 更改为 $(IntermediateOutputPath)\Final.js。所以应该创建文件。然后我创建了一个单独的目标来嵌入这个文件。

   <Target Name="EmbedResource" Condition=" '$(ConfigurationName)' == 'Release' ">
        <Message Text="Copying into Embedded..." Importance="high" />
        <ItemGroup>
          <EmbeddedResource Include="$(IntermediateOutputPath)\Final.js" >
            <LogicalName>
              Final.js
            </LogicalName>
          </EmbeddedResource>
        </ItemGroup>
      </Target>

但是,仍然没有运气。

4

1 回答 1

1

(更新以更好地回答问题。)

我相信您遇到的问题是缩小是作为构建的一部分发生的,这意味着生成的 final.js 文件在 TestMinify 目标中不可用。嵌入本身可以包含在这样的项目组中。

<Target Name="Build" Condition=" '$(ConfigurationName)' == 'Release' ">
    <!-- other stuff -->

    <ItemGroup>
        <EmbeddedResource Include="final.js" />

        <!-- other stuff -->
    </ItemGroup>
</Target>

为了避免在主构建目标中重复,条件也可以像这样直接放在EmbeddedResource标签中。

<Target Name="Build">
    <!-- other stuff -->

    <ItemGroup>
        <EmbeddedResource Condition=" '$(Configuration)' == 'Release' " Include="final.js" />

        <!-- other stuff -->
    </ItemGroup>
</Target>

TestMinify然后,您可以在主要目标之前调用您的Build目标。

或者,您可以创建预构建事件来生成文件。它需要调用可执行文件而不是 MSBuild 任务。

这是预构建事件的外观示例。

<PropertyGroup>
  <PreBuildEvent>if "$(ConfigurationName)" equ "Release" (copy "$(ProjectDir)source.js" "$(ProjectDir)final.js")</PreBuildEvent>
</PropertyGroup>

在第二种情况下,可以通过前面提到的任何一种方式设置Build带有 的目标。EmbeddedResource

于 2014-02-24T21:38:45.097 回答