Visual Studio生成后事件-复制到相对目录位置


228

对于成功的构建,我希望将输出目录的内容复制到同一“基本”文件夹下的其他位置。此父文件夹是相对的,可以根据源代码管理设置而有所不同。

我列出了一些可用的宏值...

$(SolutionDir)= D:\ GlobalDir \ Version \ AppName \ Solution1 \ build

$(ProjectDir)= D:\ GlobalDir \ Version \ AppName \ Solution1 \ Version \ ProjectA \

我想将输出目录的内容复制到以下文件夹:

D:\ GlobalDir \ Version \ AppName \ Solution2 \ Project \ Dependency

基本位置“ D:\ GlobalDir \ Version \ AppName”需要从上述宏之一中获取。但是,没有一个宏值列出父位置。

如何提取post build copy命令的基本位置?

Answers:



293

这是您要放入项目的Post-build事件命令行中的内容:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

编辑:或如果您的目标名称不同于项目名称。

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"

1
好提示。我忘了报价。
马特·蒙塔格

3
这对我没用,因为我忘记了/Y。感谢您显示整个命令。
2012年

10
可以使用xcopy通配符和适当的开关来达到相似的结果,同时保持源文件夹的(树)结构,例如:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku 2013年

4
我建议在源代码部分中使用$(TargetName)代替$(ProjectName)。
亚历山大·施密特

2
更新到我的上一页。注释:copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\",没有多余的反斜杠,因为$(SolutionDir)包含尾随的反斜杠(至少在VS2012中如此)
冰冷


10

我认为这是相关的,但是当直接使用msbuild命令行(从批处理文件)进行构建而不是从VS内部进行构建时,我遇到了问题。

使用如下所示的内容:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(注意:start XCOPY不是XCOPY用来解决防止复制的权限问题)

从批处理文件执行msbuild时,该宏的$(SolutionDir)计算结果为..\,导致XCOPY命令失败。从Visual Studio内部构建时,它可以正常工作。确认使用/verbosity:diagnostic来查看评估的输出。

$(ProjectDir)..\相反,使用宏(相当于同一件事)可以很好地工作,并在两种构建方案中都保留了完整路径。


1
交叉链接到同一黑客,以防万一我忘记给
别人

Start为我工作(用于xcopy共享文件夹)。
AgentFire

4

直接使用msbuild会没有意义吗?如果您在每次构建时都这样做,那么可以在末尾添加msbuild任务吗?如果您只想查看是否找不到在Visual Studio IDE中未显示的另一个宏值,则可以将msbuild选项打开以诊断,这将向您显示所有可以使用的变量,如下所示:以及它们的当前值。

要在Visual Studio中启用此功能,请转到“工具/选项”,然后在树状视图中向下滚动到“项目和解决方案”部分,将其展开并单击“构建并运行”,在它们的右侧是一个下拉列表,用于指定构建输出的详细程度,将其设置为诊断,将显示您还可以使用哪些其他宏值。

因为我不太了解您想要升级到什么级别,以及想要构建的复杂程度如何,所以这可能会让您有所了解。我最近一直在做构建脚本,甚至在构建过程中执行SQL代码。如果您需要更多帮助或什至一些示例构建脚本,请告诉我,但是如果您只是想在构建结束时运行的一个小过程,则可能无法使用完整的msbuild脚本来解决问题。

希望它能帮助Rihan


thhan Rihan,但显然VS 2003似乎不支持此功能!我当然对发布后的活动很满意;-)
Preets

我没有意识到这是vs2003,因此,如果我记得vs2003在msbuild时代之前,那么使用msbuild作为可能的解决方案?感谢您的回复。祝您在VS 2003上万事如意,在转到VS2005后,我没有回头
Rihan Meij
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.