Premake: как предотвратить добавление элементов ‹Link› в файлы проекта VS2013?

Я храню все свои исходные файлы в отдельном месте, чтобы мой багажник был чистым и организованным. Я просто указываю на это местоположение «SourceCode» в моих файлах lua, но устанавливаю свое «местоположение» в совершенно отдельный каталог «сборок». По большей части это дает именно тот тип поведения, который мне нужен, и кажется элегантным решением. Кроме...

Когда я запускаю premake для создания файлов проекта, он создает элементы Link для каждого включенного файла (элемент Compile). В результате при открытии файла решения создается посторонняя папка. Эта папка больше никогда не используется.

Ex выдержка из сгенерированного файла проекта:

<ItemGroup>
    <Compile Include="..\..\SourceCode\FileUtilities\FileUtilities.cs">
      <Link>SourceCode\FileUtilities\FileUtilities.cs</Link>
    </Compile>
    <Compile Include="..\..\SourceCode\FileUtilities\FileWriter.cs">
      <Link>SourceCode\FileUtilities\FileWriter.cs</Link>
    </Compile>
</ItemGroup>

При открытии решения в VS2013 создаются папки «bin» и «obj» (при необходимости). Но дополнительный каталог «SourceCode» (и его дочерние элементы) также создается, но больше никогда не используется. Есть ли флаг, который я могу использовать, чтобы просто сказать premake НЕ включать блоки ссылок в файлы проекта?

Я использую premake5.

Вот как настроена моя структура каталогов:

\trunk\builds
\trunk\SourceCode\<Contains separate folders for each projects source code>
\trunk\premake\solutions\<contains premake solution files>
\trunk\premake\projects\<contains premake project files>
\trunk\premake\configurations\<contains premake configuration files>

файл решения шаблона, 'solution-Template.lua':

solutionName = "Template"

solution(solutionName)

    location("../../builds/" .. solutionName)

    --Include a configuration file to define all your build settings
    include "../configurations/configurations-Template.lua"

    --List all the projects contained in your solution.
    --Note: The first project will be the default StartUp project
    include "../projects/project-Template.lua"
    include "../projects/project-AnotherProject.lua"

файл проекта шаблона, 'project-Template.lua':

projectName = "Template"

buildLocation = projectName
if solutionName ~= nil then
    buildLocation = solutionName .. "/" .. projectName
end

project(projectName)

    location("../../builds/" .. buildLocation)

    --kind is the output type of the project.
    --https://github.com/premake/premake-core/wiki/kind
    kind "SharedLib"
    --language is the programming language the project is written in
    --https://github.com/premake/premake-core/wiki/language
    language "C#"
    targetdir("../../builds/" .. buildLocation .. "/bin/%{cfg.buildcfg}")

    --List all the files used in the project using relative paths
    --The wild card "*" works (e.g. *.cs). "**" checks all child folders
    files
    {
        "../../SourceCode/Template/File1.cs",
        "../../SourceCode/Template/File2.cs",
        "../../SourceCode/Template/Etc.cs"
    }

    --List all the libraries/references that your project uses, including 
    --other projects
    links 
    {
        "System",
        "Template"
    }

файл конфигурации шаблона, 'configurations-Template.lua':

configurations { "Debug", "Release" }

--Define the platform configuration names. These can be named anything.
--Visual Studio will default to the first value upon opening the solution.
--Note: Be careful, 'Win32' is a predefined name and will be replaced with 'x86' even if
--you set the architecture to "x64".
platforms { "Win64", "Win32" }

--Set all the filters needed to produce the desired build/platform configuration results.
--https://github.com/premake/premake-core/wiki/Configurations_And_Platforms
filter "configurations:Debug"
    defines { "DEBUG" }
    flags { "Symbols" }

filter "configurations:Release"
    defines { "NDEBUG" }
    optimize "On"

filter { "platforms:Win32" }
    system "Windows"
    architecture "x86"

filter { "platforms:Win64" }
    system "Windows"
    architecture "x64"

Затем я бы запустил следующую команду из командной строки в \trunk\premake:

premake5 --file=./solutions/solution-Template.lua vs2013

В результате в моем каталоге \trunk\builds\ создается папка, а в ней создается папка для каждого проекта. Это именно то, что я хочу (и мой багажник будет в порядке и чистоте). Однако при открытии файла решения в VS2013 автоматически создаются папки для моих каталогов SourceCode вместе с папками bin и obj, но они вообще ни для чего не используются. Насколько я могу судить, это связано с добавлением элементов Link в файлы проекта.


person Kevin Pick    schedule 30.07.2015    source источник
comment
Какую версию премейка вы используете? И возможно ли иметь иерархию вашего проекта + соответствующие части сценария Premake?   -  person Citron    schedule 02.08.2015
comment
Я отредактировал свой оригинальный пост с дополнительной информацией. Спасибо!   -  person Kevin Pick    schedule 03.08.2015


Ответы (2)


Обычно Visual Studio настаивает на том, чтобы вы хранили исходные коды C# в каталоге вашего проекта. Хорошим тестом будет попытка создать такой же макет проекта вручную в Visual Studio; он должен создать те же <Link> элементов. Если это не так, лучше всего будет открыть новую заявку с краткое описание того, чем разметка Visual Studio отличается от того, что генерирует Premake.

Извините, позвольте мне изменить это, чтобы сделать его более ясным: файлы по умолчанию, которые создает Visual Studio (т. е. когда вы выбираете File > New Project…), всегда находятся в том же каталоге, что и файл проекта, или в подкаталоге этого местоположения. Если вы попытаетесь добавить новый файл в проект, VS всегда поместит его в папку под проектом. В этом случае элемент <Link> не нужен.

MyProject/MyProject.csproj
MyProject/src/Hello.cs  <--- in or under project directory, no link needed

Вы пытаетесь поместить исходные файлы в каталог выше расположения файла проекта.

MyProject/build/MyProject.csproj
MyProject/src/Hello.cs <--- not in or under project directory, needs link

Если вы переместите папку src/ в расположение файла проекта, Premake не добавит элемент <Link>. И если вы попытаетесь создать такой же макет — src/, расположенный за пределами каталога проекта — в Visual Studio, вы обнаружите, что он сам добавляет <Link> элементов.

person J. Perkins    schedule 03.08.2015
comment
Когда я создаю решение и проекты в VS2013, просто используя расположение файлов по умолчанию, элементы Link не добавляются в файлы проекта. Должен отметить, что на моей предыдущей работе мы организовали свой багажник точно так же, как я это делаю сейчас, и у нас не было этой проблемы. Я полагаю, что мы использовали версию 1 (просто премейк), но я не могу быть уверен в этом на 100%. Я могу пока жить с этим, так как папка builds — это просто временная папка, которая никогда не регистрируется. Это просто вызывает обострение моего обсессивно-компульсивного расстройства. - person Kevin Pick; 03.08.2015
comment
Насколько я могу судить, именно элементы Link вызывают автоматическое создание папок src при открытии решения в VS. Мне кажется странным, что эти папки ни для чего не используются. - person Kevin Pick; 03.08.2015
comment
Кроме того, эти элементы Link создаются с помощью premake. Если я удаляю их из файлов проекта, они не создают пустые папки src, даже если я открываю решение, вношу изменения, закрываю (и сохраняю) и снова открываю. Таким образом, требование, чтобы исходные файлы располагались под решением/проектами, является скорее предложением :) - person Kevin Pick; 03.08.2015

Я решил это, изменив vs2005_csproj.lua (и запустив «premake5 embed», а затем пересобрав premake). Я добавил условие «if _ACTION» в строке 180.

if external then
--Change by Kpick, this is not needed (at least for vs2013)
    if _ACTION < "vs2013" then
        _p(3,'<Link>%s</Link>', path.translate(link))
    end
end

Я должен добавить, что я не проверял, нужен ли вообще элемент Link для любой версии VS. Я просто знаю, что это НЕ нужно для vs2013, и я не хотел изменять исходный код больше, чем нужно.

person Kevin Pick    schedule 04.08.2015