如何在具有多个协作者的环境中使用本地化的 PostBuildEvent?
How do I use a localized PostBuildEvent in an environment with multiple collaborators?
我有一个项目具有以下内容 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 中的文件,或者 none 中的文件对 .csproj
的其他更改将会通过。
有什么方法可以让我的本地化 PostBuildEvent
不强加给其他合作者?
正如我在评论中提到的,我认为这应该只针对 Release
构建。该操作可以完全跳过,除非它是通过利用 ConfigurationName
宏在 Release
配置中构建的。
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. I also understand that 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.
我通过设置用户帐户级环境变量解决了这个问题,并根据它使用它或使用默认值。
我只是将原来的 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。
我有一个项目具有以下内容 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 中的文件,或者 none 中的文件对 .csproj
的其他更改将会通过。
有什么方法可以让我的本地化 PostBuildEvent
不强加给其他合作者?
正如我在评论中提到的,我认为这应该只针对 Release
构建。该操作可以完全跳过,除非它是通过利用 ConfigurationName
宏在 Release
配置中构建的。
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. I also understand that 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.
我通过设置用户帐户级环境变量解决了这个问题,并根据它使用它或使用默认值。
我只是将原来的 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。