Подтвердить что ты не робот

Использование Microsoft AJAX Minifier с Visual Studio 2010 1-щелчок публикации

Microsoft AJAX Minifier предоставляет задачу сборки, которые могут использоваться в определениях TFS или локальной сборки.

Я успешно использовал это как в локальном файле проекта (для создания отдельных файлов), так и в определениях сборки TFS (переписывая существующие файлы JS).

Я бы хотел перейти к использованию функции публикации на Visual Studio 2010 с функцией "1 клик", а не к определению сборки TFS, однако добавление задачи миниатюрирования в качестве цели AfterBuild в файле проекта не означает, что публикация 1-клика особенность.

Используя информацию, найденную в этот поток и эти статьи, я попытался создать файл с именем '[ProjectName].wpp.targets в моем корневом каталоге WAP и использовал следующий XML:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\Microsoft\MicrosoftAjax\ajaxmin.tasks" />
<Target Name="Minify" BeforeTargets="MSDeployPublish">
    <ItemGroup>
      <JS Include="**\*.js" Exclude="**\*.min.js;**\*vsddoc.js;**\*debug.js" />
    </ItemGroup>
    <ItemGroup>
      <CSS Include="**\*.css" Exclude="**\*.min.css" />
    </ItemGroup>
    <AjaxMin JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" CssSourceFiles="@(CSS)" CssSourceExtensionPattern="\.css$" CssTargetExtension=".min.css" />
  </Target>
</Project>

Это не имеет никакого эффекта, и, к сожалению, Visual Studio не дает много информации обратной связи или отладки для этих инструментов.

Кто-нибудь имел успех, уменьшающий JavaScript/CSS с помощью функции публикации 1-щелчка Visual Studio 2010?

4b9b3361

Ответ 1

Я просто написал подробную запись в блоге о том, как это сделать на http://sedodream.com/2011/02/25/HowToCompressCSSJavaScriptBeforePublishpackage.aspx и http://blogs.msdn.com/b/webdevtools/archive/2011/02/24/how-to-compress-css-javascript-before-publish-package.aspx.

Вот содержание

Сегодня я увидел сообщение на stackoverflow.com с просьбой об использовании Microsoft AJAX Minifier с публикацией в Visual Studio 2010 1-click. Это ответ на этот вопрос. Трубка Web Publishing довольно обширна, поэтому нам легко подключиться к ней, чтобы выполнить такую ​​работу. Одна из тех точек расширения, о которых ранее сообщалось в блоге, создает файл .wpp.targets. Если вы создадите файл в той же директории вашего проекта с именем {ProjectName}.wpp.targets, то этот файл будет автоматически импортирован и включен в процесс сборки/публикации. Это упрощает редактирование процесса сборки/публикации без необходимости редактировать сам файл проекта. Я буду использовать этот метод, чтобы продемонстрировать, как сжимать файлы CSS и JavaScript, которые содержит проект, прежде чем он будет опубликован/упакован.

Хотя вопрос конкретно указывает Microsoft AJAX Minifier, я решил использовать компрессор, содержащийся в разделе Packer.NET(ссылка в разделе ресурсов). Я сделал это, потому что, когда я смотрел на задачу MSBuild для AJAX Minifier, он не выглядел так, как будто я мог контролировать расположение вывода сжатых файлов. Вместо этого он просто записывается в ту же папку с расширением, как .min.cs или .min.js. В любом случае, когда вы публикуете/упаковываете проект веб-приложений (WAP), файлы копируются во временное место перед публикацией/пакетом. Значением по умолчанию для этого местоположения является obj {Configuration}\Package\PackageTmp\где {Конфигурация} - это конфигурация сборки, которую вы используете в настоящее время для своего WAP. Поэтому нам нужно сделать, чтобы WPP скопировал все файлы в это место, а затем мы можем сжать CSS и JavaScript, которые находятся в этой папке. Цель, копирующая файлы в это место, - CopyAllFilesToSingleFolderForPackage. (Чтобы узнать больше об этих объектах, посмотрите файл% Program Files (x86)%\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets.) Чтобы сделать наш целевой запуск после этой цели мы можем использовать атрибут MSBuild AfterTargets. Проект, который я создал, чтобы продемонстрировать это, называется CompressBeforePublish, из-за этого я создаю новый файл с именем CompressBeforePublish.wpp.targets, чтобы содержать мои изменения.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <UsingTask TaskName="SmallSharpTools.Packer.MSBuild.Packer"
             AssemblyFile="$(MSBuildThisFileDirectory)..\Contrib\SmallSharpTools.Packer\SmallSharpTools.Packer.dll" />

  <!-- This target will run after the files are copied to PackageTmp folder -->
  <Target Name="CompressJsAndCss" AfterTargets="CopyAllFilesToSingleFolderForPackage">
    <!-- Discover files to compress -->
    <ItemGroup>
      <_JavaScriptFiles Include="$(_PackageTempDir)\Scripts\**\*.js" />
      <_CssFiles Include="$(_PackageTempDir)\Content\**\*.css" />
    </ItemGroup>

    <Message Text="Compressing JavaScript files" Importance="high" />
    <!-- 
      Compress the JavaScript files. 
      Not the usage of %(JavaScript.Identity which causes this task to run once per
      .js file in the JavaScriptFiles item list.
      For more info on batching: http://sedotech.com/resources#Batching
    -->
    <Packer InputFiles="%(_JavaScriptFiles.Identity)"
            OutputFileName="@(_JavaScriptFiles->'$(_PackageTempDir)\Scripts\%(RecursiveDir)%(Filename)%(Extension)')"
            Mode="JSMin"
            Verbose="false"
            Condition=" '@(_JavaScriptFiles)' != ''" />

    <Message Text="Compressing CSS files" Importance="high" />

    <Packer InputFiles="%(_CssFiles.Identity)"
            OutputFileName="@(_CssFiles->'$(_PackageTempDir)\Content\%(RecursiveDir)%(Filename)%(Extension)')"
            Mode="CSSMin"
            Verbose="false"
            Condition=" '@(_CssFiles)' != '' "/>
  </Target>
</Project>

Здесь Ive создал одну цель, CompressJsAndCss, и я включил AfterTargets = "CopyAllFilesToSingleFolderForPackage", которая заставляет ее запускаться после CopyAllFilesToSingleFolderForPackage. Внутри этой цели я делаю две вещи, собираю файлы, которые нужно сжать, а затем сжимаю их.

1. Собирайте файлы для сжатия

<ItemGroup>
  <_JavaScriptFiles Include="$(_PackageTempDir)\Scripts\**\*.js" />
  <_CssFiles Include="$(_PackageTempDir)\Content\**\*.css" />
</ItemGroup>

Здесь я использую список элементов как для файлов JavaScript, так и для файлов CSS. Обратите внимание, что я использую свойство _PackageTempDir для загрузки файлов .js и .css во временную папку, где файлы записываются для упаковки. Причина, по которой Im делает это вместо сбора исходных файлов, заключается в том, что моя сборка может выводить другие .js и .css файлы и которые будут опубликованы. Примечание: поскольку свойство _PackageTempDir начинается с подчеркивания, в будущих версиях он не гарантирует себя (или даже существует).

2. Сжатие файлов

Я использую задачу Packer для сжатия файлов .js и .css. Для обоих наборов файлов использование довольно похоже, поэтому я буду смотреть только на первое использование.

<Packer InputFiles="%(_JavaScriptFiles.Identity)"
        OutputFileName="@(_JavaScriptFiles->'$(_PackageTempDir)\Scripts\%(RecursiveDir)%(Filename)%(Extension)')"
        Mode="JSMin"
        Verbose="false"
        Condition=" '@(_JavaScriptFiles)' != ''" />

Здесь задача загружается всеми .js файлами для сжатия. Обратите внимание, как я передавал файлы в задачу, используя,% (_ JavaScriptFiles.Identity), в этом случае то, что это значит, должно заставить эту задачу выполняться один раз за файл .js. Синтаксис% (abc.def) вызывает пакетную обработку, если вы не знакомы с пакетом, см. Ниже. Для значения выходного файла я снова использую свойство _PackageTempDir. В этом случае, поскольку элемент уже существует, я мог бы упростить это как @(_ JavaScriptFiles → % (FullPath)), но я думал, что вы можете найти это выражение полезным в том случае, если вы сжимаете файлы, которые еще не существуют в Папка _PackageTempDir.

Теперь, когда мы добавили эту цель в файл .wpp.targets, мы можем опубликовать/упаковать наш веб-проект, а содержащиеся файлы .js и .css будут сжаты. Примечание. Всякий раз, когда вы изменяете файл .wpp.targets, вам придется выгружать/перезагружать веб-проект, чтобы изменения были подобраны, Visual Studio кэширует ваши проекты.

На изображении ниже вы можете увидеть разницу, сжимающую эти файлы. enter image description here

Вы можете загрузить весь проект ниже, а также взглянуть на некоторые другие ресурсы, которые у меня есть, что вас может заинтересовать.

Ресурсы

Ответ 2

Для этого, чтобы работать в visual studio 2015, мы должны изменить "AfterTarget" из

<Target Name="CompressJsAndCss" AfterTargets="CopyAllFilesToSingleFolderForPackage">

следующему

<Target Name="CompressJsAndCss" AfterTargets="PipelineCopyAllFilesToOneFolderForMsdeploy">

наслаждаться!!