如何在具有多个协作者的环境中使用本地化的PostBuildEvent?

时间:2015-05-29 12:02:57

标签: git visual-studio msbuild visual-studio-2015

我有一个项目有以下PostBuildEvent

<PostBuildEvent>
 if exist Diagnostic.nuspec 
 if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe"
 "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
 pack Diagnostic.nuspec 
 -OutputDirectory "C:\Users\jeroen\Google Drive\NugetLocal\VSDiagnostics"
</PostBuildEvent>

这里,OutPutDirectory显然是我自己安装的本地版本。默认值为.

此配置存储在项目的.csproj文件中,该文件还会跟踪对其他程序集和项目中文件的引用等内容。

出于这个原因,我不能简单地忽略git中的文件,也不会对.csproj进行任何其他更改。

有没有办法保留我的本地化PostBuildEvent而不将其强加给其他合作者?

2 个答案:

答案 0 :(得分:3)

我通过设置用户帐户级环境变量来解决它,并根据它,使用它或使用默认值。

我只是将原来的PostBuildEvent和周围的PropertyGroup换成了这个:

<Choose>
    <When Condition=" $(NUGETLOCAL) != '' ">
        <PropertyGroup>
            <PostBuildEvent>if exist Diagnostic.nuspec if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" pack Diagnostic.nuspec -OutputDirectory $(NUGETLOCAL)</PostBuildEvent>
            <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
        </PropertyGroup>
    </When>
    <Otherwise>
        <PropertyGroup>
            <PostBuildEvent>if exist Diagnostic.nuspec if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" pack Diagnostic.nuspec -OutputDirectory .</PostBuildEvent>
            <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
        </PropertyGroup>
    </Otherwise>
</Choose>

环境变量设置为NUGETLOCAL,值为"C:\Users\jeroen\Google Drive\NugetLocal\VSDiagnostics"(包括重音符号)。如果未设置变量,它将使用默认目录,并且用户可以选择在他想要的任何时间定义自己的目录。

代码可能不尽如人意,所以如果你看到了改进,请告诉我。

我详细阐述了这个here

答案 1 :(得分:2)

正如我在评论中提到的,我认为这应该只针对Release版本。除非通过利用Release宏在ConfigurationName配置中构建操作,否则可以完全跳过该操作。

if $(ConfigurationName) == Release (
   if exist Diagnostic.nuspec 
   if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe"
   "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
   pack Diagnostic.nuspec 
   -OutputDirectory "C:\Users\jeroen\Google Drive\NugetLocal\VSDiagnostics"
)

此处the list of all the available Macros。我也理解all Environment variables are imported as macros,所以你可以根据用户配置文件和子目录的存在来提出一些更优雅的东西。

进一步考虑后,您可以使用标准环境变量USERPROFILE,然后检查路径是否存在。

   if exist "$(USERPROFILE)\Google Drive\NugetLocal\VSDiagnostics"(
       if exist Diagnostic.nuspec 
       if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe"
       "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
       pack Diagnostic.nuspec 
       -OutputDirectory "$(USERPROFILE)\Google Drive\NugetLocal\VSDiagnostics"
   )

但这确实有一些限制。它只适用于Windows。 Linux uses a different variable for the user profile path.