He tenido que lidiar con esto por un par de días y después de toneladas de búsqueda no puedo encontrar el camino que debería estar.

Lo que quiero hacer es configurar un MSBUILD proyecto que va a construir todo nuestro .RED de aplicación (constst de las soluciones de 8, y tal vez de 250 proyectos de dividir entre ellos) con un número de ajustes de anularse desde el individuo archivos de proyecto para hacer una versión de depuración para mí.

Específicamente quiero construir nuestra configuración de lanzamiento con las optimizaciones de apagado y completa de la información de depuración /pdbs generado. También, con el fin de reducir nuestra actualidad ultra-largo tiempo de compilación quiero «copia local» (o privada en el real proj archivo xml) falso para cada referencia de cada proyecto.

Las primeras cosas fueron bastante fácil, puedo anular un proyecto a nivel de la propiedad con bastante facilidad (incluso se puede hacer esto desde el MSBuild línea de comandos con /p), pero lo que no puedo entender es cómo reemplazar una propiedad en una referencia. He intentado varias cosas que he visto aquí en StackOverflow y alrededor de la web, pero no es una solución todavía.

Que puedo hacer lo que quiero por la alteración de Microsoft.Común.los objetivos, al comentar el código en el _CopyFilesMarkedCopyLocal destino completamente salta la copia de estos archivos. Pero no quiero cambiar mi configuración global y ello en todas las circunstancias. He creado mi propia objetivos alternativos archivo — que funciona si puedo cambiar de un individuo archivo de proyecto para que apunte a ella-pero no puedo averiguar cómo especificar este para ser utilizado en el nivel superior (mi .proj archivo que sólo genera todas las soluciones de 8). Sería genial si de alguna manera podría invalidar sólo la _CopyFilesMarkedCopyLocal objetivo en el nivel superior, de modo que si MS cambia el valor predeterminado objetivos archivo de mi build no es jodido, pero no puedo averiguar cómo hacer este trabajo.

La mejor cosa sería si hubiera una manera de anular el nivel de referencia de propiedades como se puede proyectar a nivel de propiedades, sin tener que reescribir/reemplazar los destinos de compilación cosas; pero no he encontrado ninguna información que indique que esto es posible.

Gracias de antemano por cualquier ayuda en esto.

P. S. no es posible para mí en realidad sólo ir a través de todos los proyectos en los archivos y modificarlos; necesito una solución que deja el código existente en el lugar como es.

InformationsquelleAutor David Hay | 2009-11-05

3 Comentarios

  1. 30

    Intente esto:

    Conjunto de la CustomAfterMicrosoftCommonTargets a C:\foo\filter.targets (o lo que sea que el nombre del archivo) y tienen filtro.objetivos:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <ItemDefinitionGroup>
          <Reference>
            <Private>False</Private>
          </Reference>
        </ItemDefinitionGroup>
    </Project>
    • Esto funcionó muy bien, y yo era capaz de simple añadir otro nodo como este: <ProjectReference> <Privado>False</Privado> </ProjectReference> Para obtener el mismo comportamiento en mi proyecto de referencias (en lugar de sólo los archivos refs).
    • Única cosa a tener en cuenta es que este establece el valor predeterminado para <Private>. Si se establece en cualquier <Reference>, que valor anula la especificada aquí.
    • Hay alguna forma de anular la configuración, si ESTÁ configurado en el .csproj ?
    • Nota: esto también funciona para las referencias del proyecto, si reemplazar <Referencia>, con <ProjectReference>.
    • Hay un truco: el conjunto de la Copia de referencia Local a false y luego de nuevo a la verdad, y Visual Studio agrega el Privado automáticamente los metadatos para los que hacen referencia. En menos de VS 2010.
    • en este caso usted no quiere que explícitamente se agrega al elemento en sí. si ese es el caso entonces lo anterior no sería de ayuda. Se proporciona un valor predeterminado si no se especifica.

  2. 7

    En un archivo como filtro.objetivos agregar un destino:

    <Target Name="BeforeBuild">
      <ItemGroup>
            <ReferenceNew Include="@(Reference)">
               <Private>False</Private>
            </ReferenceNew>
            <Reference Remove="@(Reference)"/>
            <Reference Include="@(ReferenceNew)"/>
      </ItemGroup>
    </Target>

    Este recreará la @(Referencia) lista de los metadatos «Privado», establece en false, que se asegurará de que la referencia no se copian.
    A continuación, ejecutar la generación de la solución o proyecto con la propiedad $(CustomAfterMicrosoftCommonTargets) establece la ruta de acceso a este filtro.objetivos archivo.

    msbuild foo.sln /p:CustomAfterMicrosoftCommonTargets=c:\foo\filter.targets

    De esta manera, el BeforeBuild objetivo se invoca antes de la construcción del proyecto, y todas las referencias será fijado de acuerdo. Si desea más control sobre cuándo o si Privadas debe ser falso o verdadero, puede alterar la BeforeBuild de destino y de control que a través de las propiedades.

    Editar: puede ser una mejor manera de establecer los metadatos en el BeforeBuild de destino.

    • Esto no parece funcionar para mí. Definitivamente es ejecutar el BeforeBuild de destino (puse un mensaje tarea en la que hay que comprobar para asegurarse de que se muestra arriba) para cada proyecto, pero no parece estar haciendo nada para las referencias. Esto se siente como la dirección correcta, pero todavía le queda algo de descuento con el objetivo de que se presentaron anteriormente.
    • Intente imprimir de las referencias antes y después de cambiar ellos, en el BeforeBuild Objetivo a sí mismo. La impresión de esta manera: «ref: %(de Referencia.De Identidad) : %(De Referencia.Privado)»
    • Yo era capaz de conseguir que este método de trabajo, finalmente, para las referencias (yo tenía algo mal en el archivo de filtro), pero creo que Sayed la solución anterior es más limpio.
    • De hecho lo es 🙂
    • Nota: esto también funciona para las referencias del proyecto, si reemplazar <Referencia>, con <ProjectReference>.
    • Esto parece funcionar, pero es también la copia de la GAC dll o más bien Dll aparte de mi propio. ¿Cómo puedo filtrar? O excluir System.dll etc.?
    • El Set de CopyLocalDependenciesWhenParentReferenceingac’ true suprimir ese comportamiento.

  3. 1

    Comenzando con msbuild v 15 se puede copiar un solo archivo llamado Directorio.Construir.props en la raíz de la carpeta que contiene la fuente.

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

    Esto funciona bien con Visual Studio 2017 y el vNext Construir. Puede usted tener a cerca de Visual Studio y de abrir la solución de nuevo para tomar el archivo de efecto.

    https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build#directorybuildprops-and-directorybuildtargets

Dejar respuesta

Please enter your comment!
Please enter your name here