Как вы включаете дополнительные файлы с использованием пакетов веб-развертывания VS2010?

StackOverflow https://stackoverflow.com/questions/2747081

Вопрос

Я проверяю использование новой функциональности веб-упаковки в Visual Studio 2010 и столкнулся с ситуацией, когда я использую событие предварительного сборки, чтобы скопировать необходимые .dll в папке Bin, которую мое приложение опирается на вызовы API. Они не могут быть включены в качестве ссылки, поскольку они не являются COM DLL, которые могут использоваться с помощью Interop.

Когда я создаю пакет развертывания, эти файлы исключаются при выборе параметра, чтобы включить только файлы, необходимые для запуска приложения. Есть ли способ настроить параметры развертывания, чтобы включить эти файлы? Мне не повезло найти любую хорошую документацию на этом.

Это было полезно?

Решение

Отличный вопрос. Я только что разместил очень подробную запись в блоге об этом в Инструмент веб развертывания (MSDEPLOY): сборка пакета, включая дополнительные файлы или исключая определенные файлы.

Вот синопсис. После включения файлов я покажу как исключить файлы.

В том числе дополнительные файлы

Включая дополнительные файлы в пакет немного сложнее, но до сих пор нет Bigee, если вам удобно с MSBuild, и если вы этого не читаете. Для этого нам нужно подключить участок процесса, который собирает файлы для упаковки. Цель, которую нам нужно расширить, называется PopyallFileStoStlefolder. Эта цель имеет свойство зависимости, PipreilePredePloyCopyAllFileStooneFolderDependson, что мы можем подключить и вводить нашу собственную цель. Таким образом, мы создадим цель с именем CustomCollectFiles и ввести, что в процесс. Мы достигаем этого со следующими (помните после оператора импорта).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>

  <CopyAllFilesToSingleFolderForMsdeployDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
  </CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>

Это добавит нашу цель к процессу, теперь нам нужно определить цель цель. Предположим, что у вас есть папка с именем дополнительных файлов, которые сидят 1 уровень выше вашего веб-проекта. Вы хотите включить все эти файлы. Вот цель CustomCollectFiles, и мы обсудим после этого.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Вот что я сделал, было создать товар _Customfiles, и в Icque Attribute сообщил, что он забрал все файлы в этой папке и любой папке под ним. Если по какой-либо шанс вам нужно исключать что-то из этого списка добавьте Exclude приписывать _CustomFiles.

Затем я использую этот пункт, чтобы заполнить элемент файловогоFORPackageFromProject. Это элемент, который MSDEPLOY на самом деле использует для добавления дополнительных файлов. Также обратите внимание, что объявил значение MetAdata PeritionRelativePath. Это определит относительный путь, который он будет размещен в пакете. Я использовал заявление дополнительных файлов% (Recursivedir)% (имя файла)% (расширение) здесь. То, что это говорит, это разместить его в том же относительном месте в упаковке, так как он находится в папке дополнительных файлов.

Исключая файлы

Если вы откроете файл проекта веб-приложения, созданного с VS 2010 в направлении его в нижней части его, вы найдете строку.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

Кстати, вы можете открыть файл проекта внутри VS. Щелкните правой кнопкой мыши на проекте Project Pick Unload. Затем щелкните правой кнопкой мыши на выгруженном проекте и выберите «Редактировать проект».

Это утверждение будет включать все цели и задачи, которые нам нужны. Большинство наших настроек должны быть после этого импорта, если вы не уверены, если после! Поэтому, если у вас есть файлы, чтобы исключить, есть имя элемента, исключательFuckageFilesfiles, которые можно использовать для этого. Например, скажем, что у вас есть файл с именем Thumbers.debug.js, который включен в ваше веб-приложение, но вы хотите, чтобы этот файл был исключен из созданных пакетов. Вы можете поместить фрагмент ниже после этого оператора импорта.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

Объявив заполнение этого элемента, файлы будут автоматически исключены. Обратите внимание на использование метаданных отTarget здесь. Я не буду вступить в это здесь, но вы должны знать, чтобы всегда указывать это.

Другие советы

Упрощенное решение - редактировать файл CSPROJ, чтобы включить требуемую DLL в папке Bin, а затем создать целевую цену, чтобы скопировать элемент в папку Bin из папки «Общая библиотека», где мы храням наши третий Party DLL. Поскольку элемент существует в файле решения, он развернут MSBUILD / MSDEPLOY, и не требуется ничего сложного.

Тег используется для включения файла без добавления через VS (который захочет добавить его в свои VCS обычно)

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>

Это цель добычи, которая работала для меня:

<Target Name="BeforeBuild">
    <Message Text="Copy $(SolutionDir)Library\3rdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" />
    <Copy SourceFiles="$(SolutionDir)Library\3rdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" />
</Target>

Отредактировано, чтобы включить предложение @ Tuesepetre, чтобы скрыть запись, удаляя предыдущий недостаток видимой папки Bin. Не зарегистрирован мной.

Так же, как @toxaq, но еще упрощенное решение - это:

В исследовательском исследовании добавьте файл в виде ссылки на папку «Библиотека / ссылки», а затем в свойствах устанавливают его, чтобы быть скопированы на вывод сборки.

Таким образом, реализация изящных не работает для меня. Я использую VS2013 и использую пакет развертывания веб-развертывания и необходимый для добавления некоторых плагинов DLL из другой папки в корзину пакета развертывания. Вот как мне удалось сделать это работать (гораздо проще):

В нижней части вашего файла CSPROJ Добавить:

<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
    <ItemGroup> 
        <Files Include="..\SomeOtherProject\bin\$(Configuration)\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" />  
</Target>

Другие упоминания в файле CSPROJ:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DeployOnBuild>true</DeployOnBuild>
    <DeployTarget>Package</DeployTarget>
    <DeployIisAppPath>Default Web Site/MyWebsite</DeployIisAppPath>
    <DesktopBuildPackageLocation>..\output\Service\Service\Service.Release.zip</DesktopBuildPackageLocation>
    <FilesToIncludeForPublish>OnlyFilesToRunTheApp</FilesToIncludeForPublish>
    <ExcludeGeneratedDebugSymbol>true</ExcludeGeneratedDebugSymbol>
    <PublishDatabases>false</PublishDatabases>
</PropertyGroup>

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" />

Хотел прокомментировать, чтобы подчеркнуть комментарий Emil Lerch выше. Если вы установили Azure SDK, то ищите другую зависимость.

По сути, вам может потребоваться использовать «portaallfilestoStylefolderformsdeploydependson) вместо" portyallfilestoStlefolderforpackedependson ". Я не совсем продвинутый парень Msbuild, и я потратил впустую часы, потянув свои волосы, пытаясь определить, почему мои цели не вызывали.

Вот еще одна ссылка, если это не работает для вас, и вы установили Azure SDK: http://forums.iis.net/t/1190714.aspx.

В качестве добавления к ответу заявленного, я обнаружил, что статическая декларация исключения предметов IncludeFrepackageFiles внутри моего проекта было недостаточно. Мне нужно было исключить определенные DLL, которые были доступны только после Компиляция (Azure Special Ninject модули, которые не нужны, когда я развернут IIS).

Поэтому я пытался зацепить в создании моего списка ExcudeFrompackageFilesfiles, используя COPYALLFILESTOSTORESTLEDFOLDERFORPCADEEPENSENDOND TRICK SEED, опубликованную выше. Однако это слишком поздно, так как процесс упаковки уже удалил элементы ExcudeFrempackageFilesfiles. Итак, я использовал ту же технику, но немного раньше:

<PropertyGroup>
    <ExcludeFilesFromPackageDependsOn>
        $(ExcludeFilesFromPackageDependsOn);
        _ExcludeAzureDlls
    </ExcludeFilesFromPackageDependsOn>
</PropertyGroup>

<Target Name="_ExcludeAzureDlls">
    <ItemGroup>
        <FilesForPackagingFromProjectWithNoAzure Include="@(FilesForPackagingFromProject)"
                               Exclude="%(RootDir)%(Directory)*Azure*.dll" />
        <AzureFiles Include="@(FilesForPackagingFromProject)"
                    Exclude="@(FilesForPackagingFromProjectWithNoAzure)" />
        <ExcludeFromPackageFiles Include="@(AzureFiles)">
            <FromTarget>_ExcludeAzureEnvironmentDlls</FromTarget>
        </ExcludeFromPackageFiles>
    </ItemGroup>
</Target>

Надеюсь, что поможет кому-то ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top