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

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

Когда я запускаю 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 НЕ включать блоки Link в файлы проекта?

Я использую 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 в файлы проекта.

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> Сама стихия.

Я решил это, изменив 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, и я не хотел изменять исходный код больше, чем должен был.

Другие вопросы по тегам