2009-05-01 5 views
16

Al agregar una referencia a un proyecto de aplicación web en VS (2008 en este caso), se crea el "hintpath" en el archivo csproj como una referencia relativa. ¿Hay alguna manera (utilizando la GUI, no editando manualmente el archivo) para hacer de esto una referencia absoluta (es decir, C: \ Temp \ DllName.dll)?Obligue que una referencia sea absoluta con Visual Studio

El problema al que me estoy enfrentando es cuando máquinas de construcción separadas tienen directorios de trabajo diferentes para el proyecto. Cuando la referencia es relativa, y la dll referenciada no está dentro del directorio de trabajo del proyecto, la referencia relativa puede no apuntar a la misma ubicación en ambas máquinas.

+1

¿Cuál es el propósito de querer una ruta no relativa? Podría entender que quiero un camino que incluya una Carpeta Especial, pero un camino completamente codificado es inflexible en todos los sistemas. – STW

+2

@Yoooder No has visto las divertidas trayectorias relativas que a Visual Studio le gusta usar, también puede ser difícil. Los he visto ... a la raíz y luego a la carpeta de destino, es genial. – hova

+0

Estaba buscando esto. ¿Por qué? Tengo algunos métodos de extensión que se recuperan de los cambios en las diferentes versiones de la aplicación a lo largo de los años. Gracias AutoDesk. Espera no. Estos métodos de extensión son universales en todas mis aplicaciones. No quiero tener que parchar todas las aplicaciones en mi máquina porque necesito cambiar o agregar una solución para las incoherencias de AutoCAD. Quiero arreglarlo en un solo lugar. La única otra forma sensata de hacer esto es con un servidor Nuget local. ¿Overkill mucho? –

Respuesta

-1

Me gustaría ayudar pero ¿por qué es esto necesario? Nunca tuve que hacer esto nunca, desde vs.net beta 2003. Creo que hay otra pregunta más profunda aquí.

Si debe puede probar la página Curso de referencia en las propiedades del proyecto

+0

Normalmente, esto sucede cuando alguien más carga un proyecto en una solución, en una profundidad de ruta diferente a la que se creó originalmente. – hova

+2

He dirigido equipos de .net durante años e irás # @ # $ nuts de esta manera. Esto es lo primero que soluciono Haga que todos muerdan la bala y organice su proyecto de solución y haga referencia a un corte de {beep} de cualquier persona que lo emita. – Gary

+0

Bueno, eso explica por qué nunca has tenido que hacer esto entonces. – hova

0

Trate clic derecho en las propiedades del proyecto, y luego ir a las rutas de referencia, y la adición de los caminos fuertemente codificados allí.

+1

Lo hice, pero no parece cambiar realmente nada en el archivo .csproj. Entonces, ¿no debería agregarse esto en cada máquina dev/build? – Jeremy

5

De forma predeterminada, Visual Studio utiliza referencias relativas cuando la referencia se agrega inicialmente, porque asume que la referencia es a un archivo en otra parte de su copia de trabajo.

Este antes me vuelven loco, pero lo resolvió en tres formas diferentes:

  1. Al mantener mi código fuente en mi D: conducir, lo que significa que las DLL hace referencia en la unidad C: no se podía almacenar con caminos relativos.
  2. Persuadiendo a los poderes fácticos de usar una sola imagen/script para todas las estaciones de trabajo de los desarrolladores. Ahora que son todos iguales, los archivos están todos en el mismo lugar en la unidad C :.
  3. Al darse cuenta de que puede agregar carpetas al AssemblyFolders registry key, significa que ya no tiene que usar rutas de ningún tipo para hacer referencia a conjuntos conocidos.
+1

Yar, colocándolo en otra unidad, o algo mapeado como otra unidad parece ser la única manera de vencer esto. –

+0

El enlace en 3 está roto ... ¿es esto? http://stackoverflow.com/a/238445/1507899 – RJB

+0

Lo suficientemente cerca, sí. –

5

La única manera que he encontrado para hacerlo es editando el archivo csproj manualmente después de agregar la referencia.

<Reference Include="foo, Version=1.2.3.4, Culture=neutral, ..."> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>C:\absolute\path\foo.dll</HintPath> 
</Reference> 

y sí, me gusta rutas absolutas y toda la locura despliegue automático que crea, pero en este caso tengo que hacer referencia a una envoltura de .NET que utiliza una DLL COM que tiene que ser "instalado" y hacer las cosas al registro, etc. por lo que un camino absoluto es el único camino a seguir.

10

Esta es una pregunta anterior, pero sigue siendo relevante. Me encontré con esto mientras buscaba una solución para hacer referencia a conjuntos desde un repositorio global de software de terceros.

Mi enfoque en este momento es similar a la respuesta escrita por thinkOfaNumber. En lugar de utilizar una ruta absoluta codificada, prefiero incrustar una variable de entorno en el archivo .csproj. La variable de entorno contiene la ruta absoluta. Ejemplo:

<Reference Include="Foo"> 
    <HintPath>$(THIRDPARTY_ROOT)\foo\3.1.0\bin\foo.dll</HintPath> 
</Reference> 

Este nivel adicional de indirección da la flexibilidad de tener diferentes caminos en diferentes máquinas de construcción (por ejemplo, del sistema desarrollador vs. servidor de compilación).

Aún así, necesito editar manualmente el archivo .csproj para hacer esto.

+0

Sí, su respuesta es la que realmente llega al punto. Es una tontería discutir quién hace la llamada sobre cuál es la ruta, y si las rutas relativas o las rutas absolutas son la mejor opción. La realidad es que si puede afirmar que todos los desarrolladores tienen la misma configuración o no (¡NO!), Es probable que el servidor de compilación se configure de forma diferente. Si no usa variables en sus rutas de sugerencia, entonces no está haciendo esto de una manera muy sofisticada o flexible. Dicho esto, Microsoft necesita hacerlo de forma intuitiva para que las variables de proyecto o de entorno puedan definirse para contener estos datos. – paulyphonic

+1

Microsoft también debe permitir múltiples elementos HintPath para que itere a través de ellos hasta que encuentre una coincidencia. De hecho, asumí que basándome en la palabra "pista" (si le das a alguien una pista, y no ayuda, probablemente deberías darles otra pista ... "sugerencia") que esto estaría permitido, y ¡solo descubrió a través de la resolución de problemas que solo le importa el último elemento HintPath que encuentra! – paulyphonic

+4

Tenga en cuenta que VS almacena en caché las rutas a los ensamblados a los que se hace referencia en el archivo '.suo'. Por lo tanto, si cambia el valor de la variable de entorno THIRDPARTY_ROOT, no olvide cerrar la solución y eliminar el archivo '.suo', luego vuelva a abrir la solución. – SergeyT

0

También nos encontramos con este problema. Queríamos utilizar rutas absolutas porque cada implementación creó la carpeta Paquetes en diferentes ubicaciones (y también tenemos varias máquinas de construcción). La idea era tener los paquetes NuGet en un solo lugar, lo que liberaría la memoria desperdiciada de tener múltiples copias de la misma cosa.

Nuestro problema específico era que podíamos establecer la ruta absoluta en el archivo NuGet.Config, los paquetes NuGet restaurarían esa ubicación durante una implementación, pero luego no pudo encontrarlos durante el paso de MSBuild en el mismo despliegue.

Escribí un script de PowerShell para solucionar este problema. Básicamente reemplaza las referencias relativas de HintPath con la ruta absoluta que quiero usar.

#Get list of all csproj files in a solution 
$dir = Get-ChildItem $pwd -Recurse 
$list = $dir | Where {$_.extension -eq ".csproj"} 

#Replace relative paths with absolute path 
$absolutePath = 'C:\absolute\path\Packages' 
function replaceRelativePath($line){ 
    if($line -match '<HintPath>[^C].+\\Packages') 
    { 
     $relative = $matches[0] -replace '\\','\\' 
     return ($line -replace "$relative", "<HintPath>$absolutePath") 
    } 
    else 
    { 
     return $line 
    } 
} 

#Updating files 
Foreach($file in $List) 
{ 
    (Get-Content $file.FullName)| ForEach-Object{replaceRelativePath($_)} | Set-Content $file.FullName 
} 

Configuramos este script para que se ejecute como un paso de compilación de PowerShell antes de que MSBuild realice los pasos en nuestro despliegue. El resultado es que los archivos csproj se cambian para el directorio de trabajo en las máquinas de compilación, pero no en el control de código fuente de Visual Studio. (Si desea que cambien en el control de código fuente, probablemente pueda ejecutar esto en PowerShell y verifique los cambios).

Cuestiones relacionadas