Pregunta

Estoy probando a cabo utilizando la nueva funcionalidad de envase en banda en Visual Studio 2010 y se encontró con una situación en la que yo uso un evento de pre-construcción de copiar .dll necesarios en mi carpeta bin que mi aplicación se basa en las llamadas API. Ellos no pueden ser incluidos como referencia ya que no son archivos DLL COM que se pueden utilizar con interoperabilidad.

Cuando construyo mi paquete de implementación de esos archivos se excluyen cuando elijo la opción de incluir sólo los archivos necesarios para ejecutar la aplicación. ¿Hay una manera de configurar los ajustes de implementación para incluir estos archivos? No he tenido ninguna suerte para encontrar cualquier buena documentación sobre este.

¿Fue útil?

Solución

Muy buena pregunta. Me acaba de publicar una entrada de blog muy detallada sobre esto en Herramienta de implementación web (MSDeploy): Construir paquete que incluye archivos adicionales o exclusión de archivos específicos .

Esta es la sinopsis. Después de incluir archivos, se muestra cómo excluir archivos también.

La inclusión de archivos adicionales

La inclusión de archivos adicionales en el paquete es un poco más difícil, pero todavía no hay bigee si se siente cómodo con MSBuild, y si no se leen esto. Con el fin de hacer esto tenemos que enganchar en la parte del proceso que recopila los archivos para el embalaje. El objetivo necesitamos extender se llama CopyAllFilesToSingleFolder. Este objetivo tiene una propiedad de dependencia, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, que podemos aprovechar e inyectar nuestro propio destino. Así que vamos a crear un objetivo CustomCollectFiles nombradas e inyectar que en el proceso. Esto lo conseguimos con la siguiente (recuerda después de la declaración de importación).

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

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

Esto se añadirá a nuestro objetivo del proceso, ahora tenemos que definir el propio objetivo. Supongamos que usted tiene una carpeta de archivos extra con nombre que se asienta 1 nivel por encima de su proyecto web. Desea incluir todos esos archivos. Aquí está el CustomCollectFiles se dirigen y se discute después de eso.

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

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

Aquí lo que hice fue crear las _CustomFiles artículo y en el atributo incluye contó a recoger todos los archivos de esa carpeta y cualquier carpeta debajo de ella. Si por casualidad usted necesita Excluir algo de esa lista, añadir un atributo Exclude a _CustomFiles.

Entonces utilizar este elemento para rellenar el elemento FilesForPackagingFromProject. Este es el elemento que MSDeploy utiliza realmente para agregar archivos adicionales. Observe también que declaré el valor DestinationRelativePath metadatos. Esto determinará la ruta relativa que se colocará en el paquete. He utilizado la declaración archivos% (RecursiveDir)% (Nombre)% adicional (Extensión) aquí. Lo que está diciendo es colocarla en la misma ubicación relativa en el paquete, ya que se encuentra bajo la carpeta de archivos extra.

Exclusión de archivos

Si abre el archivo de proyecto de una aplicación web creada con VS 2010 hacia el fondo del mismo encontrará una línea con.

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

Por cierto, se puede abrir el archivo de proyecto dentro de VS. Haz clic derecho en el proyecto recoger Descargar proyecto. A continuación, haga clic derecho sobre el proyecto descargado y seleccione Editar proyecto.

Esta declaración incluirá todos los objetivos y las tareas que necesitamos. La mayor parte de nuestras personalizaciones debe ser después de que la importación, si no está seguro de si después de poner! Así que si tiene archivos para excluir hay un nombre de artículo, ExcludeFromPackageFiles, que se pueden utilizar para hacerlo. Por ejemplo, digamos que usted tiene archivo llamado Sample.Debug.js que incluían en su aplicación web, pero desea que el archivo que deben excluirse de los paquetes creados. Puede colocar el fragmento a continuación después de que la declaración de importación.

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

Al declarar poblar este artículo serán automáticamente excluidos los archivos. Tenga en cuenta el uso de los metadatos FromTarget aquí. No voy a entrar en eso aquí, pero usted debe saber que especificar siempre.

Otros consejos

Una solución más sencilla consiste en editar el archivo csproj para incluir la dll necesario en la carpeta bin y luego crear un objetivo BeforeBuild para copiar el elemento en la carpeta bin de la carpeta de biblioteca común donde almacenamos nuestros archivos DLL de 3 ª parte. Debido a que el elemento existe en el archivo de solución se despliega por msbuild / MSDeploy y nada complicada que se necesita.

Tag utiliza para incluir archivos sin añadir través de VS (que tendrá que añadir a sus VCS por lo general)

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

Este es el objetivo BeforeBuild que trabajó para mí:

<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>

Editado para incluir la sugerencia de @ tuespetre para ocultar la entrada eliminando así la desventaja anterior de una carpeta bin visible. No verificado por mí.

Al igual que @toxaq, pero una solución aún más simple es:

En el explorador de soluciones añadir el archivo como un enlace a la biblioteca / carpeta de referencias, y luego en las propiedades determinan que se va a copiar a la salida de la construcción.

Así aplicación de Sayed no funcionó para mí. Estoy usando VS2013 y utilizando el paquete Web Implementar y es necesario añadir algunos archivos DLL plugin desde otra carpeta a la papelera del paquete de despliegue. Así es como me las arreglé para que sea trabajo (mucho más fácil):

En la parte inferior de su archivo csproj complemento:

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

Otros mentionables en el archivo 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" />

quería comentar destacar el comentario de Emil Lerch anteriormente. Si ha instalado un SDK Azure, luego buscar un DependencyProperty diferente.

Básicamente, es posible que tenga que utilizar "CopyAllFilesToSingleFolderForMsdeployDependsOn en lugar de 'CopyAllFilesToSingleFolderForPackageDependsOn'. No estoy realmente un tipo avanzado y MSBUILD I horas perdidas tirando de mi pelo a cabo tratando de determinar por qué mis objetivos no estaban recibiendo llamadas.

Aquí hay otro enlace si esto no funciona para usted y ha instalado un SDK Azure: http://forums.iis.net/t/1190714.aspx

Como una adición a la respuesta de Sayed, he encontrado que una declaración estática de ExcludeFromPackageFiles artículos dentro de mi proyecto no era suficiente. Que necesitaba para excluir ciertos archivos DLL que sólo estaban disponibles después de / (módulos específicos Azure ninject que no son necesarios cuando despliego a IIS) de compilación.

Así que traté de conectar en la generación de mi lista ExcludeFromPackageFiles usando el truco CopyAllFilesToSingleFolderForPackageDependsOn Sayed publicado anteriormente. Sin embargo, esto es demasiado tarde ya que el proceso de envasado se ha eliminado ya los artículos ExcludeFromPackageFiles. Por lo tanto, he utilizado la misma técnica, pero un poco más temprano:

<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>

Espero que ayude a alguien ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top