argumentos c# visual-studio-2010 msbuild csproj

c# - argumentos - msbuild project



.csproj rutas de sugerencia mĂșltiples para un ensamblado (6)

Estoy empaquetando código de ejemplo para una distribución de SDK. En la distribución, la ruta relativa desde el código hasta los ensamblados del SDK es diferente de la máquina de compilación. Por ejemplo:

Distribución

csharp/bin/assembly.dll example/ex1/ex1.csproj

Construir la máquina

foo/sdk/csharp/bin/assembly.dll bar/baz/quux/ex1/ex1.csproj

Supongamos que no puedo mover nada. ¿Hay alguna manera de que pueda instruir a ex1.csproj para que mire en ambos

../../csharp/bin/ y ../../../../foo/sdk/csharp/bin/ for assembly.dll ?

En C ++ colocaría la ruta de dependencia en una hoja de propiedades independiente y distribuiría una versión diferente con el SDK. Pero C # no tiene hojas de propiedades, y no quiero mantener dos versiones del proyecto completo.

He visto esta pregunta que dice que no puedo usar varias etiquetas <HintPath> , así que estoy buscando otra forma de aproximarme al mismo comportamiento.


Agregue la ruta secundaria de la siguiente manera al grupo de propiedades general. en el archivo csproj

<PropertyGroup> <ReferencePath>../../../../../foo/sdk/csharp/bin/</ReferencePath> ... </PropertyGroup>

La propiedad ReferencePath está destinada a ser especificada al ejecutar MsBuild, pero funcionará bien así.


Encontré una solución hacky que funciona para mi caso, donde se garantiza que el directorio principal será diferente en algún lugar del árbol:

<Choose> <When Condition="Exists(''$(MSBuildProjectDirectory)/../../example'')"> <ItemGroup> <Reference Include="Assembly ..."> <HintPath>../../csharp/bin/assembly.dll</HintPath> </Reference> </ItemGroup> </When> <Otherwise> <ItemGroup> <Reference Include="Assembly ..."> <HintPath>../../../../../foo/sdk/csharp/bin/assembly.dll</HintPath> </Reference> </ItemGroup> </Otherwise> </Choose>



La manera más sencilla, ya que solo se puede utilizar ONE HintPath, es utilizar el atributo de Condición todo-así, así:

<Reference Include="TheAssembly"> <HintPath Condition="Exists(''../My/Assembly/Path'')">../My/Assembly/Path/TheAssembly.dll</HintPath> <HintPath Condition="Exists(''../../My/Assembly/Path'')">../../My/Assembly/Path/TheAssembly.dll</HintPath> <HintPath Condition="Exists(''../../../My/Assembly/Path'')">../../../My/Assembly/Path/TheAssembly.dll</HintPath> <HintPath Condition="Exists(''../../../../My/Assembly/Path'')">../../../../My/Assembly/Path/TheAssembly.dll</HintPath> <HintPath Condition="Exists(''../../../../../My/Assembly/Path'')">../../../../../My/Assembly/Path/TheAssembly.dll</HintPath> <HintPath Condition="Exists(''../../../../../../My/Assembly/Path'')">../../../../../../My/Assembly/Path/TheAssembly.dll</HintPath> <HintPath Condition="Exists(''../../../../../../../My/Assembly/Path'')">../../../../../../../My/Assembly/Path/TheAssembly.dll</HintPath> etc... </Reference>

Entonces la respuesta a la pregunta sería esta:

<Reference Include="assembly"> <HintPath Condition="Exists(''../../csharp/bin'')">../../csharp/bin/assembly.dll</HintPath> <HintPath Condition="Exists(''../../../../foo/sdk/csharp/bin'')">../../../../foo/sdk/csharp/bin/assembly.dll</HintPath> </Reference>

Si coinciden varias condiciones, se usará la última.


Puede /csharp/bin carpeta /csharp/bin en una unidad (de manera diferente en cada máquina), por ejemplo X: y luego hacer referencia a X:/ o X:/bin en ambas máquinas, ya que la ruta será la misma.


Simplemente agregue la ubicación del servidor de compilación de los archivos DLL como ruta de referencia en el proyecto. Parece hacer el truco muy bien y es muy simple. Funciona solo si conoce la carpeta del servidor de compilación de las DLL.