2011-05-06 18 views
15

En el proceso de limpieza de la estructura de la carpeta/archivo en un proyecto que heredé, estoy corriendo en un problema con la organización de las bibliotecas externas requeridas. Quiero guardarlos en su propia carpeta .\dll\, pero no se copian correctamente en el directorio de compilación. Deberían estar en el directorio de compilación raíz, pero en su lugar se moverán a una subcarpeta.archivo de proyecto de MSBuild: Copiar elemento a la ubicación específica en el directorio de salida

Mi archivo .csproj contiene la siguiente xml:

<Project> 
    <ItemGroup> 
    <None Include="dlls\libraryA.dll"> 
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </None> 
    </ItemGroup> 
</Project> 

A continuación, en la acumulación, el archivo libraryA.dll se copia en la carpeta bin\Debug\dll\, pero lo quiero en la carpeta bin\Debug\.

Respuesta

13

yo probamos este y msbuild siempre quiere copiar los archivos a través de su ruta de directorio, pero no es una solución ...

Editar el archivo csproj y después de esta línea:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 

añadir estos líneas:

<PropertyGroup> 
    <PrepareForRunDependsOn>$(PrepareForRunDependsOn);MyCopyFilesToOutputDirectory</PrepareForRunDependsOn> 
    </PropertyGroup> 

    <Target Name="MyCopyFilesToOutputDirectory"> 
    <Copy SourceFiles="@(None)" DestinationFolder="$(OutDir)" /> 
    </Target> 

La copia de los archivos de salida ocurre en el destino PrepareForRun. Esto agrega su propio objetivo a la lista de objetivos que se ejecutan como parte de PrepareForRun.

En este ejemplo se copia todos los artículos del grupo de artículos Ninguno. Puede crear su propio grupo de elementos (por ejemplo, Mis archivos) y hacer la copia en ese grupo de elementos si tiene otros archivos "Ninguno" que no desea copiar. Cuando probé esto, tuve que cambiar el nombre del grupo de elementos editando directamente el archivo csproj. Visual Studio no me permitió configurar el grupo de elementos de un archivo desde la interfaz de usuario, pero después de editar el archivo csproj y modificarlo, Visual Studio mostró correctamente el nombre de mi grupo de elementos personalizado.

+4

funciona como un sueño, gracias! Para tener una referencia para otros, yo terminé creando mi propio nombre del grupo (es decir, '') entonces, sólo tenía que asegurarse de que la opción CopyToOutputDirectory se establece en Nunca (que es el defecto). – chezy525

+1

Acabo de tropezar con esta solución - ¡IMPRESIONANTE! También voy a añadir en el que se pueden cambiar las DestinationFolder = "$ (OutDir)" '' a DestinationFolder = "$ (OutDir) \% (RecursiveDir)" '' si tiene algo más que una estructura de directorios plana y se puede agregue el extra 'SkipUnchangedFiles =" true "' si solo quiere copiar los archivos actualizados cada vez .. @BrianWalker - ¡Eres un campeón freaking! –

+0

Si ayuda, para cualquier persona con el mismo tipo de problema, me comentó mi solución utilizando esta lógica aquí: http://stackoverflow.com/a/19989390/1693085 –

Cuestiones relacionadas