Estoy usando Visual Studio 2017 y tengo un evento previo a la compilación.

Tengo un proyecto ubicado en C:\Project\src\Project\, con un archivo por lotes doSomething.bat en C:\Project\src\Project\doSomething.bat.

En mi evento previo a la compilación, quiero ejecutar doSomething.bat, así que tengo este script:

cd $(ProjectDir) && call ./doSomething.bat

Sin embargo, $(ProjectDir) realmente me coloca en C:\Project\src\Project\bin\Debug\netcoreapp1.1\

Esto no es lo que dice la documentación. ¿Cómo puedo arreglar esto?

1
James Monger 27 abr. 2017 a las 14:17

3 respuestas

La mejor respuesta

En el caso de los proyectos basados ​​en SDK, PreBuildEvent y PostBuildEvent se evalúan demasiado pronto para recibir valores "finales" para muchas propiedades, incluso se consideran obsoletos (consulte https://github.com/dotnet/project-system/issues/1569)

Como solución rápida, puede usar $(MSBuildProjectDirectory) o $(MSBuildThisFileDirectory) que le dará el directorio en el que se encuentra el archivo .csproj.

Para una solución más integrada, puede agregar un objetivo personalizado al archivo csproj de esta manera (no se necesita el paso cd):

<Target Name="MyAfterBuild" AfterTargets="Build">
  <Exec Command="test.bat" />
</Target>
4
Martin Ullrich 27 abr. 2017 a las 11:33

Hay una solución alternativa sobre cómo hacer que resuelva macros comunes y propiedades correctamente (discutido en el hilo, mencionado por @MartinUllrich).

Vea un ejemplo en el enlace. Los puntos clave de la solución es modificar el archivo .csproj para que:

  • La etiqueta raíz permanece sin atributos: solo <Project> en lugar de <Project Sdk="Microsoft.NET.Sdk">
  • Importar Sdk.props al principio: <Import Sdk="Microsoft.NET.Sdk.Web" Project="Sdk.props" />
  • Importe Sdk.targets antes de los eventos previos y posteriores a la compilación: <Import Sdk="Microsoft.NET.Sdk.Web" Project="Sdk.targets" />
0
Alex Klaus 23 jun. 2017 a las 04:51

Esto sucedió después de editar manualmente el archivo del proyecto.

Inadvertidamente moví esta línea:

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

A debajo los elementos <PropertyGroup><PreBuildEvent> ... desde su posición original encima de ellos.

Prueba esto:

  1. Abra su archivo de proyecto, por ejemplo, MyProject.csproj (o MyProject.vbproj).
  2. Encuentra <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> (o <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />).
  3. Muévalo directamente encima del comienzo de los elementos del evento de compilación (<PropertyGroup><PreBuildEvent> ...)
  4. Limpia el proyecto / solución, recompila y deberías ser buena.

Nota: también tuve otro proyecto que tenía este error fuera de la caja, así que creo que también puede "suceder".

1
SteveCinq 10 sep. 2018 a las 18:58