Pregunta

¿Puedo configurar la opción por defecto de "Copia Local" en Visual Studio para Falso? En la mayoría de las veces, cuando agrego un archivo DLL como la dependencia de un proyecto, quiero que el conjunto de propiedades Copia local en False. Por defecto, es cierto. ¿Hay una manera de cambiar el comportamiento predeterminado de Visual Studio? (2008)

¿Fue útil?

Solución

No -. Visual Studio utiliza un conjunto interno de reglas para determinar qué juego de copias local a

MSDN :

  
      
  1. Si la referencia es otro proyecto, denominado una referencia al proyecto a proyecto, entonces el valor es true .
  2.   
  3. Si el conjunto se encuentra en la caché de ensamblados global, el valor es false .
  4.   
  5. Como caso especial, el valor de la referencia de mscorlib.dll es false .
  6.   
  7. Si el conjunto se encuentra en la carpeta Framework SDK, entonces el valor es false .
  8.   
  9. De lo contrario, el valor es true .
  10.   

Otros consejos

En realidad, se puede. Es necesario un par de cosas:

  1. Crear archivo .targets que hace CopyLocal (etiqueta <Private>, para ser precisos) false por defecto .
  2. Importar el objetivo en archivos .csproj. Se puede añadir que en la última línea, antes de cerrar la etiqueta </Project>, parecerá que <Import Project="..\Build\yourtarget.targets" />.

Ahora cada proyecto con este objetivo tiene CopyLocal desactivados por defecto.

El inconveniente es que es necesario modificar el archivo de todos y cada uno csproj, incluyendo otros nuevos. Puede solucionar el tema nuevo proyecto modificación de la plantilla de proyecto VS . En lugar de Class.cs se describe en el artículo del blog, es necesario modificar Class.vstemplate (en el mismo archivo zip).

Con ese enfoque, hay un problema más - el camino en sí. Si utiliza Hardcoded ruta relativa en los archivos csproj recién generados, que pueden estar mal (a menos que tenga la estructura del proyecto plana).

Es posible:

  • Haga VS generar ruta relativa correcta. No está seguro de cómo hacerlo, y si eso es posible.
  • ignorarlo y cambie la ruta manualmente para cada nuevo csproj (dependiendo del número de nuevos proyectos que tiene, mientras que no es ideal, que puede ser tolerable).
  • Utilice la variable de entorno en lugar de ruta relativa. En ese caso, cada desarrollador tendrá el mismo conjunto de variables.

Tiene que haber una mejor solución para eso, pero no han encontrado todavía.

No utilizamos un archivos .targets (como se sugiere en la respuesta por ya23), por lo que acabamos de editar el archivo de proyecto .csproj manualmente en un editor de texto y añadir el elemento <Private> a la referencia, así:

<Reference Include="[...]">
  <Private>False</Private>
  [...]
</Reference>

El valor del elemento <Private> coincide con el valor de la propiedad "copia local". Por ejemplo, si <Private> se establece en False, "copia local" también es falso ..

El topar esto porque parece que ahora hay un paquete Nuget permitiendo exactamente esto ...

https://nuget.org/packages/CopyLocalFalse

¿No han probado hasta ahora, sólo la esperanza de que ayude.

A partir de msbuild v 15 se puede copiar un solo archivo llamado Directory.Build.props en la carpeta raíz que contiene la fuente:

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

No hay nada más que hacer! Esto funciona bien con Visual Studio 2017 y también la construcción vNext. Puede que tenga que cerrar Visual Studio y que su solución abierta de nuevo para tomar el efecto archivo.

https: // docs .microsoft.com / es-es / VisualStudio / msbuild / modificar-su-build # directorybuildprops-y-directorybuildtargets

En cuanto a la solución Publicado por @herzbube, si desea desactivar la opción "Copia Local" para todos (o la mayoría) de las referencias en su archivo .csproj usted no necesita conjunto <Private>False</Private> individualmente en cada Reference, sólo se puede poner lo siguiente directamente en la .csproj

<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
</ItemDefinitionGroup>

Esto no afecta a los proyectos referenciados con <ProjectReference>, pero se puede hacer lo mismo - ya sea en lugar o además - para aquellos que:

<ItemDefinitionGroup>
  <ProjectReference>
    <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>

Si quiere ambas cosas, puede combinarlos en un solo grupo:

<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
  <ProjectReference>
    <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>

Asegúrese de poner estas anulaciones antes de la primera <Reference ...> real o <ProjectReference ...> desea afecta porque estos bloques sólo se aplicarán a aquellas referencias que aparecen debajo de ellos. Entonces, si hay unos pocos que DO en realidad quieren ser copiado localmente, puede simplemente reemplazar los Atrás de forma individual (es decir, dentro de la sí etiquetas individuales), esta vez utilizando True.

En los casos más avanzados puede cambiar la parte trasera valor primordial y vuelta entre true y false varias veces en el mismo archivo .csproj. Otra técnica avanzada sería para colocar estratégicamente algunas de sus referencias por debajo de estos bloques, y los demás por encima, por lo que no se verán afectados este último.

Todo esto debe hacer que el código XML en su .csproj mucho más limpio y más fácil de leer. Pero aún hay más buenas noticias, así que sigue leyendo ...


En cuanto a seleccionar qué proyectos deben estar marcados <Private>False</Private> esto por lo general depende de la situación específica, pero hay algo fundamental todos puede y debe hacer para empezar. Es un paso tan básico, simple y eficaz y que ofrece, tales MSBuild mejoras en la fiabilidad 1 y aceleración-tiempo de construcción enorme - y con poco inconveniente - que todas las soluciones de gran tamaño. que utiliza el (es decir, local, por proyecto) C # por defecto ubicaciones de salida deben casi siempre realizar este ajuste:

  

En todas y cada una solución de Visual Studio que construye múltiples C # bibliotecas de la clase con cualquier número no trivial de <ProjectReference> interdependencias, y que culmina en la construcción de una más aplicaciones (es decir, ejecutables):

     
      
  1. En la parte superior del .csproj para cada biblioteca de clase , insertar el bloque <ProjectReference> aparecen arriba.
      Razón: No hay necesidad de ninguna .dll para reunir cualquiera de las bibliotecas de las cuales se refiere a un subdirectorio de su propia, ya que no ejecutable se ejecuta siempre desde esa ubicación. Dicha copia es rampante busywork inútil y puede ser innecesariamente ralentizar su construcción, posiblemente de manera espectacular.

  2.   
  3. Por otra parte, hacer no modificar el .csproj para cualquiera de aplicaciones de su solución .
      RAZÓN: Los ejecutables necesitan tener todas las bibliotecas privadas integradas que necesitan en sus respectivos subdirectorios, pero la acumulación para cada aplicación solo deben ser responsables de la recopilación de forma individual cada dependencia, directamente de su respectiva sub-directorio, en sub-de la aplicación directorio.

  4.   

Esto funciona perfectamente porque el .csproj para una biblioteca de clases puede hacer referencia a varias otras bibliotecas de clases, pero la .csproj para un ejecutable por lo general nunca hace referencia a otro ejecutable. Por lo tanto, para cada biblioteca local integrado, el único .dll en su carpeta bin será en sí, mientras que todas las aplicaciones localmente integrada contendrá el conjunto de bibliotecas localmente incorporados que hace referencia.

Bien, nada cambia para las bibliotecas de referencia que no están construidos por su solución, ya que estos por lo general el uso de INSTE <Reference>anuncio de <ProjectReference>, y nosotros no modificó la antigua etiqueta en absoluto. Sin embargo, hacer notar el supuesto de que acabamos de mencionar; si se viola por algunos de sus proyectos, es posible que tenga que hacer algunos ajustes.

[1.] Mejoras en la confiabilidad podrían estar relacionados con colisiones de archivos que pueden producirse cuando la recolección de la misma biblioteca de múltiples caminos disjuntos en un gráfico de la dependencia, especialmente en concurrente construye.

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